标题:请教可以检测到Messagebox()在运行吗?
只看楼主
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
样式有很多种,一种不行就尝试各种组合
程序代码:
#define MB_APPLMODAL                0
#define MB_SYSTEMMODAL              0x1000
#define MB_TASKMODAL                0x2000
#define MB_NOFOCUS                  0x8000
#define MB_SETFOREGROUND            0x10000
#define MB_DEFAULT_DESKTOP_ONLY     0x20000
#define MB_TOPMOST                  0x40000
2023-05-14 20:57
wxzd123
Rank: 2
等 级:论坛游民
帖 子:238
专家分:43
注 册:2012-9-6
得分:0 
回复 20楼 吹水佬
版主你好,8192对话框跑到后面去了
2023-05-15 06:37
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用wxzd123在2023-5-15 06:37:34的发言:

版主你好,8192对话框跑到后面去了

未遇到过messagebox跑到后面而出不来的情况。
给个能令messagebox跑到后面去的示例测试一下。
2023-05-15 08:43
wxzd123
Rank: 2
等 级:论坛游民
帖 子:238
专家分:43
注 册:2012-9-6
得分:0 
吹水佬、sdta二位版主您看看什么原因?
对话框.rar (10.58 KB)
2023-05-15 14:23
foxfans
Rank: 4
等 级:贵宾
威 望:11
帖 子:90
专家分:278
注 册:2021-10-23
得分:0 
自己都设置成alwaysontop=.t. 总是置顶....,.

[此贴子已经被作者于2023-5-15 15:02编辑过]

2023-05-15 14:41
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
以下是引用wxzd123在2023-5-15 14:23:36的发言:

吹水佬、sdta二位版主您看看什么原因?

9楼已经给出了大致的范围,表单设置问题。

坚守VFP最后的阵地
2023-05-15 14:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
绕了几圈才搞清楚是什么问题。
2023-05-15 16:01
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
以下是引用foxfans在2023-5-15 14:41:30的发言:

自己都设置成alwaysontop=.t. 总是置顶....,.

这不是理由,不带 Timeout 参数的 MessageBox 就能置前显示,带上就不一定,说明这就 vfp 的 MessageBox 存在 bug
win32 的 MessageBox api 第一个参数就用于指定宿主窗口的句柄,宿主窗口发出的 MessageBox 应该阻塞其进程的特定消息处理直到关闭对话框,显然 vfp 在带上 Timeout 时不是这样,表现形式就是不带超时参数时,你无法通过点击表单内任意区域激活窗口,必须关闭对话框后才行,而带上超时参数后,就可以随意切换激活,不管你的表单是否 AlwaysOntop 都这样,违反了 MessageBox 的本意

换句话说,从操作系统的角度来看,带超时参数的 MessageBox 是非模式的,不再是原本意义上的模式对话框。而 vfp 却没意识到,仍把它当做模式窗口处理,在关闭之前不执行其后的代码,显然与操作系统对窗口的处理相矛盾

[此贴子已经被作者于2023-5-15 16:49编辑过]

2023-05-15 16:29
wxzd123
Rank: 2
等 级:论坛游民
帖 子:238
专家分:43
注 册:2012-9-6
得分:0 
谢谢各位老师
2023-05-15 16:50
foxfans
Rank: 4
等 级:贵宾
威 望:11
帖 子:90
专家分:278
注 册:2021-10-23
得分:0 
其实并不存在bug,Vfp的MessageBox实际是对二个API函数的封装MessageBoxA和MessageBoxTimeoutA,
置顶状态时,MessageBoxA时抢占获得焦点只要不被其他置顶窗口激活Messagebox窗口就默认置顶在上面.
而当MessageBoxTimeoutA时,Vfp主窗口本身重绘又置顶就会把messageboxtimeout(本身不置顶)窗口置后,这时候你再弄个置顶窗口放在你主程序上面一样把Vfp主程序统统覆盖,除非你这时候Hook掉这个Messaageboxtimeout窗口,把这个窗口也设置成置顶状态,就会在你的主窗口上面,换句话说,即使你的messagebox置顶别人的也是置顶属性的窗口后激活在你messagebox窗口位置时,一样会在你messagebox窗口之上.

[此贴子已经被作者于2023-5-15 17:20编辑过]

2023-05-15 17:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-512194-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019922 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved