Winapi:使用 EnableWindow() 函数时"sent to back"窗口



为了防止用户在出现MessageBox时在我的main_window中单击,我使用了:

EnableWindow(main_window,FALSE);

我得到了一个示例MessageBox:

EnableWindow(main_window,FALSE); 
MessageBox(NULL,"some text here","About me",MB_ICONASTERISK);
EnableWindow(main_window,TRUE);

问题是,当我在MessageBox上按"OK"时,它会关闭,并且我的main_window被发送到所有其他系统窗口的后面。为什么会发生这种情况?我试着放:

SetFocus(main_window);
SetActiveWindow(main_window);

之后和之前:EnableWindow(main_window,TRUE)结果很奇怪:它50/50工作。我想我做了不该做的事。

Btw。有没有比更好的解决方案来阻止鼠标点击特定窗口

EnableWindow(main_window,FALSE);

显示模态UI需要启用模态子项并禁用所有者。当模态子项完成时,程序必须颠倒。您发布的代码看起来是实现这一点的直接方法。

但事实并非如此。

问题出现在对MessageBoxEnableWindow的调用之间,这些代码不是您编写的。MessageBox在模态子级(消息框)被销毁后返回。由于这是一个具有前台激活功能的窗口,因此窗口管理器会尝试找到一个要激活的新窗口。没有拥有的窗口,所以它从Z顺序的顶部开始搜索。它找到的第一个窗口是您的,但它仍然被禁用。因此,窗口管理器跳过它,寻找另一个未禁用的窗口。当执行对EnableWindow的调用时,已经太晚了——窗口管理器已经得出结论,应该激活另一个窗口。

正确的顺序是在销毁模式UI之前启用所有者。

然而,只有当你有理由自己实现模态时,这才是必要的。该系统提供了模式UI的标准实现。为了使用它,将句柄传递给拥有MessageBoxCreateDialog(*)等调用的窗口,窗口管理器将为您完成所有繁重的工作。

(*):不幸的是,CreateDialog的形式参数被误称为hWndParent父子和所有者拥有的关系非常不同(请参阅关于Windows)。

相关内容

最新更新