Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface WM_ACTIVATE在哪些情况下发送?_User Interface_Winapi_Visual C++ - Fatal编程技术网

User interface WM_ACTIVATE在哪些情况下发送?

User interface WM_ACTIVATE在哪些情况下发送?,user-interface,winapi,visual-c++,User Interface,Winapi,Visual C++,我正试图调试一个巨大的Win32 GUI应用程序(我有完整的源代码),它分为几个进程。问题如下:在一个进程中,我有一个带有列表框的对话框,当我双击列表框中的一个项目时,另一个进程将启动,它将创建自己的窗口,该窗口将显示在前面并覆盖初始对话框。如果我做了一些操作(我还不能完全解释,因为我还没有完全理解它们),一些东西会迫使初始对话框开始在任务栏中闪烁 我尝试了Microsoft Spy++并看到,每当我执行该操作时,WM_ACTIVATE会被发送到对话框,大多数情况下它都有以下参数: fActiv

我正试图调试一个巨大的Win32 GUI应用程序(我有完整的源代码),它分为几个进程。问题如下:在一个进程中,我有一个带有列表框的对话框,当我双击列表框中的一个项目时,另一个进程将启动,它将创建自己的窗口,该窗口将显示在前面并覆盖初始对话框。如果我做了一些操作(我还不能完全解释,因为我还没有完全理解它们),一些东西会迫使初始对话框开始在任务栏中闪烁

我尝试了Microsoft Spy++并看到,每当我执行该操作时,WM_ACTIVATE会被发送到对话框,大多数情况下它都有以下参数:

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)显示