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

时间:2010-05-20 19:33:58

标签: winapi menu createwindow

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

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

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

由于

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

4 个答案:

答案 0 :(得分:3)

组合框中的列表下拉有点像黑客,它既是弹出窗口又是子窗口,我不能推荐这种方法(未记录的样式组合,和IIRC,这样做有点儿错误一个“正常”的浮动窗口/工具栏)

这为您提供了两个选项:

  • WS_EX_NOACTIVATE(主窗口将保持活动状态,浮动窗口未激活)
  • Handle activate messages(两个窗口看起来都有效)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

很多人都错过的事实是Windows没有单独的窗口管理器组件: - 大多数窗口管理职责由每个窗口执行 - 通常在DefWindowProc中。

大多数窗口定位和激活/去激活都已完成 - 最终 - 通过调用SetWindowPos - 它总是发送WM_WINDOWPOSCHANGING消息,允许窗口对发生的事情有最终决定权。

DefWindowProc还会激活自己的窗口以响应鼠标点击等情况。

所有这一切的结果是,很有可能创建永远不会接受激活的窗口 - 它需要广泛了解哪些消息和情况可能导致激活。

最终我可以说为远程调试配置调试设置非常方便 - 这样您就可以在不影响系统激活状态的情况下与调试器进行交互 - 从而在问题WM_ACTIVATE中将断点放入窗口处理程序,只需调试导致不必要的激活的任何情况。

如果你想要处理键盘焦点,它可能会更棘手 - 通常会将焦点放在激活的窗口上 - 但同样通常是DefWindowProc负责分配两者。我只是看到它有危险,因为有一个窗口,仍然明显激活,另一个有焦点。这将极大地混淆任何辅助软件。

我很想执行消息循环级消息挂钩 - 类似于IsDialogMessage - 来过滤用于弹出窗口的按键。

答案 3 :(得分:0)

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