通常在创建子窗口(WS_POPUP)时,子窗口将变为激活状态,而父窗口将变为非激活状态。但是,对于菜单,两者都保持活动状态。至少我假设菜单是活动的,它至少有焦点。
示例:单击记事本中的文件菜单,出现菜单,但记事本窗口仍然处于活动状态。
是否可以使用窗口样式或响应特定消息来反映此行为?
谢谢
另一个例子:组合框似乎显示了一个子窗口,但并没有停用该窗口。您可以单击该子窗口,同时仍保持激活主窗口。关于如何获取该窗口的类/样式的任何想法?
通常在创建子窗口(WS_POPUP)时,子窗口将变为激活状态,而父窗口将变为非激活状态。但是,对于菜单,两者都保持活动状态。至少我假设菜单是活动的,它至少有焦点。
示例:单击记事本中的文件菜单,出现菜单,但记事本窗口仍然处于活动状态。
是否可以使用窗口样式或响应特定消息来反映此行为?
谢谢
另一个例子:组合框似乎显示了一个子窗口,但并没有停用该窗口。您可以单击该子窗口,同时仍保持激活主窗口。关于如何获取该窗口的类/样式的任何想法?
组合框中的下拉列表有点 hack,它既是弹出窗口又是子窗口,我不推荐这种方法(未记录的样式组合和 IIRC,使用“正常”执行此操作有点错误" 浮动窗口/工具栏)
这使您有两个选择:
如果您使用 WS_EX_NOACTIVATE 创建弹出窗口,它将不会被用户输入激活(您仍然可以通过编程方式激活它),因此您的主应用程序窗口仍将保持活动状态。
我很惊讶创建一个新的弹出窗口会激活它。通常你需要调用SetActiveWindow。但是,请查看WM_ACTIVATE和WM_NCACTIVATE以了解如何停止窗口被停用。
很多人错过的一个事实是,windows 没有单独的窗口管理器组件:- 大多数窗口管理职责由每个窗口执行-通常在 DefWindowProc 中。
大多数窗口定位和激活/取消激活都是通过调用 SetWindowPos 完成的,它总是发送 WM_WINDOWPOSCHANGING 消息,允许窗口对发生的事情有最终决定权。
DefWindowProc 也激活它自己的窗口以响应鼠标点击等等。
所有这一切的结果是,很有可能创建从不接受激活的窗口 - 它确实需要广泛了解可能导致激活的消息和情况。
最后,我可以说,为远程调试配置调试设置非常方便——这样您就可以在不影响系统激活状态的情况下与调试器交互——因此在 WM_ACTIVATE 处理程序问题中将断点放入窗口中,然后简单地调试任何导致不需要的激活的情况。
如果您还想处理键盘焦点,则可能会更棘手-通常将焦点赋予激活的窗口-但通常是 DefWindowProc 负责分配两者。我只是认为有一个窗口很危险,显然仍然处于激活状态,而另一个窗口则有焦点。这将极大地混淆任何辅助软件。
我很想执行一个消息循环级别的消息挂钩 - 类似于 IsDialogMessage - 以过滤用于弹出窗口的击键。