Winapi 是否可以创建不会停用父窗口的子窗口?
通常在创建子窗口(WS_弹出窗口)时,子窗口将变为激活,父窗口将变为停用。但是,使用菜单时,两者都保持活动状态。至少我假设菜单是活动的,它至少有焦点 示例:单击记事本中的“文件”菜单,菜单将出现,但记事本窗口仍处于活动状态 是否可以使用窗口样式或响应特定消息来镜像此行为 谢谢Winapi 是否可以创建不会停用父窗口的子窗口?,winapi,menu,createwindow,Winapi,Menu,Createwindow,通常在创建子窗口(WS_弹出窗口)时,子窗口将变为激活,父窗口将变为停用。但是,使用菜单时,两者都保持活动状态。至少我假设菜单是活动的,它至少有焦点 示例:单击记事本中的“文件”菜单,菜单将出现,但记事本窗口仍处于活动状态 是否可以使用窗口样式或响应特定消息来镜像此行为 谢谢 另一个例子:组合框似乎显示了一个子窗口,但没有停用该窗口。您可以单击该子窗口,同时仍保持激活主窗口。关于如何获取该窗口的类/样式有什么想法吗?我很惊讶创建一个新的弹出窗口会激活它。通常你需要打电话。但是,请检查并了解如何停
另一个例子:组合框似乎显示了一个子窗口,但没有停用该窗口。您可以单击该子窗口,同时仍保持激活主窗口。关于如何获取该窗口的类/样式有什么想法吗?我很惊讶创建一个新的弹出窗口会激活它。通常你需要打电话。但是,请检查并了解如何停止停用窗口。许多人忽略的一个事实是,windows没有单独的窗口管理器组件:-大多数窗口管理职责由每个窗口执行-通常在DefWindowProc中 大多数窗口定位和激活/取消激活最终通过调用SetWindowPos完成,SetWindowPos始终发送WM_WindowPos更改消息,允许窗口对发生的事情有最终决定权 DefWindowProc还可以激活自己的窗口以响应鼠标单击等操作 所有这一切的结果是,创建从不接受激活的窗口是完全可能的——它确实需要广泛了解哪些消息和情况可能导致激活 最后,我可以说,为远程调试配置调试设置非常方便,这样您就可以在不影响系统激活状态的情况下与调试器交互,从而在WM_ACTIVATE handler问题窗口中放置一个断点,并简单地调试任何导致不需要的调试的情况激活 如果您还想处理键盘焦点,它可能会更复杂-通常会将焦点分配给激活的窗口-但通常由DefWindowProc负责分配这两个窗口。我只是觉得有一个窗口很危险,显然仍然处于激活状态,而另一个窗口有焦点。这将大大混淆任何辅助软件
我会尝试执行一个消息循环级别的消息钩子(类似于IsDialogMessage),以过滤弹出窗口的按键。如果您使用WS_EX_NOACTIVATE创建弹出窗口,它将不会被用户输入激活(您仍然可以通过编程方式激活它)因此,您的主应用程序窗口仍将保持活动状态。组合框中的列表下拉列表有点像黑客,它既是弹出窗口又是子窗口,我不推荐这种方法(未记录的样式组合,IIRC,使用“普通”浮动窗口/工具栏进行此操作有点缺陷) 这给您留下了两个选择:
- WS_EX_NOACTIVATE(主窗口将保持活动,浮动窗口不活动)
- (两个窗口看起来都处于活动状态)
WM\u NCACTIVATE
以防止出现这种情况)。