User interface WM_ACTIVATE在哪些情况下发送?
我正试图调试一个巨大的Win32 GUI应用程序(我有完整的源代码),它分为几个进程。问题如下:在一个进程中,我有一个带有列表框的对话框,当我双击列表框中的一个项目时,另一个进程将启动,它将创建自己的窗口,该窗口将显示在前面并覆盖初始对话框。如果我做了一些操作(我还不能完全解释,因为我还没有完全理解它们),一些东西会迫使初始对话框开始在任务栏中闪烁 我尝试了Microsoft Spy++并看到,每当我执行该操作时,WM_ACTIVATE会被发送到对话框,大多数情况下它都有以下参数:User interface WM_ACTIVATE在哪些情况下发送?,user-interface,winapi,visual-c++,User Interface,Winapi,Visual C++,我正试图调试一个巨大的Win32 GUI应用程序(我有完整的源代码),它分为几个进程。问题如下:在一个进程中,我有一个带有列表框的对话框,当我双击列表框中的一个项目时,另一个进程将启动,它将创建自己的窗口,该窗口将显示在前面并覆盖初始对话框。如果我做了一些操作(我还不能完全解释,因为我还没有完全理解它们),一些东西会迫使初始对话框开始在任务栏中闪烁 我尝试了Microsoft Spy++并看到,每当我执行该操作时,WM_ACTIVATE会被发送到对话框,大多数情况下它都有以下参数: fActiv
fActive: WA_INACTIVE fMinimized:False hwndPrevious:(null)
在这种情况下,对话框不会开始闪烁。但有时,参数是
fActive: WA_ACTIVE fMinimized:False hwndPrevious:(null)
这正好对应于闪烁的对话框
当通过鼠标点击以外的方法激活窗口时(例如,通过调用SetActiveWindow函数或使用键盘界面选择窗口),WM_ACTIVATE将与WA_ACTIVE一起发送
现在,在应用程序代码中,从未调用SetActiveWindow(),我也不使用键盘切换窗口
WM_ACTIVATE在WA_ACTIVE的情况下被发送的原因还有哪些?如果您创建了一个带有
WS_VISIBLE
样式的窗口,则该窗口将在创建时被激活
如果执行ShowWindow(SW\u SHOW)
操作,它将激活该窗口(改用SW\u SHOWNA
)
如果在不使用SWP\u NOACTIVATE
标志的情况下执行SetWindowPos
,则窗口将被激活
最后,如果使用模板(CDialog)创建窗口,则该窗口始终处于激活状态。如果使用
WS\u VISIBLE
样式创建窗口,则该窗口将在创建时激活
如果执行ShowWindow(SW\u SHOW)
操作,它将激活该窗口(改用SW\u SHOWNA
)
如果在不使用SWP\u NOACTIVATE
标志的情况下执行SetWindowPos
,则窗口将被激活
最后,如果使用模板(CDialog)创建窗口,则该窗口始终处于激活状态。您的问题是由
setForeGroundIndow()
引起的。它有适当的应对措施,防止进程在用户积极使用另一个应用程序时将窗口推到用户的脸上
当第二个进程创建它的窗口并隐式尝试使用它获取前景时,就会发生SetForegroundWindow()
。(你在写《带到前线》时也这么说过。)
第一个应用程序应该调用allowSetForeGroundIndow()
说“没关系,允许该窗口从我这里获取前台激活。”
请注意,如果执行此操作,则用户可能会遇到以下情况:
- 用户单击列表框项目
- 第二个过程启动缓慢
- 用户在第一个应用程序中单击其他内容。(失去了耐心。)
- 第二个进程从第一个应用程序窃取前台。(用户因为做其他事情而感到沮丧)
这就是导致当前代码闪烁的情况。窗口管理器检测到用户已放弃等待第二个进程,并开始对第一个进程执行其他操作,因此当第二个进程最终尝试窃取前台时,它会阻止该进程。您的问题是由
setForeGroundIndow()
引起的。它有适当的应对措施,防止进程在用户积极使用另一个应用程序时将窗口推到用户的脸上
当第二个进程创建它的窗口并隐式尝试使用它获取前景时,就会发生SetForegroundWindow()
。(你在写《带到前线》时也这么说过。)
第一个应用程序应该调用allowSetForeGroundIndow()
说“没关系,允许该窗口从我这里获取前台激活。”
请注意,如果执行此操作,则用户可能会遇到以下情况:
- 用户单击列表框项目
- 第二个过程启动缓慢
- 用户在第一个应用程序中单击其他内容。(失去了耐心。)
- 第二个进程从第一个应用程序窃取前台。(用户因为做其他事情而感到沮丧)
这就是导致当前代码闪烁的情况。窗口管理器检测到用户已放弃等待第二个进程,并开始对第一个进程执行其他操作,因此当第二个进程最终尝试窃取前台时,它会阻止第二个进程。请注意我所说的,在出现对话框的情况下,您可以阻止它被激活,您需要在OnInitDialog中返回FALSE,并且该对话框必须是无模式创建的,没有WS_VISIBLE样式,并且您使用ShowWindow(SW_SHOWNA)显示它。请注意我所说的,在出现对话框的情况下,您可以防止它被激活,您需要在OnInitDialog中返回FALSE,并且该对话框必须创建为无模式,没有WS_VISIBLE样式,并使用ShowWindow(SW_SHOWNA)显示