Winapi 是否可以创建不会停用父窗口的子窗口?

Winapi 是否可以创建不会停用父窗口的子窗口?,winapi,menu,createwindow,Winapi,Menu,Createwindow,通常在创建子窗口(WS_弹出窗口)时,子窗口将变为激活,父窗口将变为停用。但是,使用菜单时,两者都保持活动状态。至少我假设菜单是活动的,它至少有焦点 示例:单击记事本中的“文件”菜单,菜单将出现,但记事本窗口仍处于活动状态 是否可以使用窗口样式或响应特定消息来镜像此行为 谢谢 另一个例子:组合框似乎显示了一个子窗口,但没有停用该窗口。您可以单击该子窗口,同时仍保持激活主窗口。关于如何获取该窗口的类/样式有什么想法吗?我很惊讶创建一个新的弹出窗口会激活它。通常你需要打电话。但是,请检查并了解如何停

通常在创建子窗口(WS_弹出窗口)时,子窗口将变为激活,父窗口将变为停用。但是,使用菜单时,两者都保持活动状态。至少我假设菜单是活动的,它至少有焦点

示例:单击记事本中的“文件”菜单,菜单将出现,但记事本窗口仍处于活动状态

是否可以使用窗口样式或响应特定消息来镜像此行为

谢谢


另一个例子:组合框似乎显示了一个子窗口,但没有停用该窗口。您可以单击该子窗口,同时仍保持激活主窗口。关于如何获取该窗口的类/样式有什么想法吗?

我很惊讶创建一个新的弹出窗口会激活它。通常你需要打电话。但是,请检查并了解如何停止停用窗口。

许多人忽略的一个事实是,windows没有单独的窗口管理器组件:-大多数窗口管理职责由每个窗口执行-通常在DefWindowProc中

大多数窗口定位和激活/取消激活最终通过调用SetWindowPos完成,SetWindowPos始终发送WM_WindowPos更改消息,允许窗口对发生的事情有最终决定权

DefWindowProc还可以激活自己的窗口以响应鼠标单击等操作

所有这一切的结果是,创建从不接受激活的窗口是完全可能的——它确实需要广泛了解哪些消息和情况可能导致激活

最后,我可以说,为远程调试配置调试设置非常方便,这样您就可以在不影响系统激活状态的情况下与调试器交互,从而在WM_ACTIVATE handler问题窗口中放置一个断点,并简单地调试任何导致不需要的调试的情况激活

如果您还想处理键盘焦点,它可能会更复杂-通常会将焦点分配给激活的窗口-但通常由DefWindowProc负责分配这两个窗口。我只是觉得有一个窗口很危险,显然仍然处于激活状态,而另一个窗口有焦点。这将大大混淆任何辅助软件


我会尝试执行一个消息循环级别的消息钩子(类似于IsDialogMessage),以过滤弹出窗口的按键。

如果您使用WS_EX_NOACTIVATE创建弹出窗口,它将不会被用户输入激活(您仍然可以通过编程方式激活它)因此,您的主应用程序窗口仍将保持活动状态。

组合框中的列表下拉列表有点像黑客,它既是弹出窗口又是子窗口,我不推荐这种方法(未记录的样式组合,IIRC,使用“普通”浮动窗口/工具栏进行此操作有点缺陷)

这给您留下了两个选择:

  • WS_EX_NOACTIVATE(主窗口将保持活动,浮动窗口不活动)
  • (两个窗口看起来都处于活动状态)

OSK.EXE(屏幕键盘)可以做到这一点——尽管是在全球范围内——你可以用spy++来戳一戳——这绝对是个好主意。然而,当我尝试它时,它似乎只是继续激活上一个窗口(即:顶部窗口仍然会稍微失去激活)。我正在尝试创建一些感觉就像菜单一样的东西(但看起来完全不同),即使是短暂的激活丢失也会让人感觉不对劲。很可能我正在做一个SW_SHOW,而不是SW_SHOWNOACTIVATE。不过,如果你不介意的话,我还有一些问题要问。您是否立即知道在未激活的窗口中是否可以对焦(即:如果用户开始使用键盘,我希望向上/向下可以像在普通菜单中一样工作)?或者你是否可以禁止点击激活?我不能说我做过,但我对结果感兴趣。尝试使用Spy++并在显示菜单时检查消息。您的链接看起来很吸引人。昨晚我想去工具窗口,但没有意识到他们的激活不是免费的。你的链接正是我需要的。非常感谢。尽管如此,主应用程序窗口仍将处于非活动状态(除非您同时处理
WM\u NCACTIVATE
以防止出现这种情况)。