繁体   English   中英

什么时候在窗口上设置最高位置无法正常工作?

[英]When does setting topmost on a window fail to work?

我有一个C ++应用程序,需要在其中创建最顶层的窗口。 有时它可以工作,但通常会失败。 在应用程序的一部分中,我创建了一个后台线程来显示最上方的信息窗口。 用户关闭窗口后,线程消失。 该应用程序首次创建线程并显示窗口时,该窗口位于最顶层。 但是,所有后续线程都无法在其窗口上设置最高位置。 我尝试过使用WS_EX_TOPMOST样式创建窗口以及在创建窗口后调用SetWindowPos。 这些方法都不起作用。 我看了一下,却找不到任何无法将窗口设置为最高位置的问题的引用。

在我运行的一个测试中,我调用了SetWindowPos,并在返回后检查了窗口的样式,即使SetWindowPos返回成功,窗口的样式也未设置为最高。 我还使用了Spy ++来检查窗口的样式,并确认未设置样式。

SetWindowPos将无声地设置WS_EX_TOPMOST的一种方法是,在创建窗口或调用SetWindowPos时,该进程没有对SetForegroundWindow的许可。 可以说,这是您希望窗口最顶部的时间之一(并且可能是您不应允许的时间之一)。

自从Vista以来,谣言被MS掩盖了那个漏洞。

限制是可以理解的-您不希望随机进程的最上面的窗口在没有业务时也失去了焦点。

当一个进程间接启动一个助手进程(例如先在父进程中启动安装然后从msiexec启动助手进程),然后助手想要成为最高或什至抢占输入时,一种合理用例的解决方法是使用AllowSetForegroundWindow。

显然,您需要有权集中精力以放弃它。

使用Borland C ++ Builder时遇到类似的问题。 在创建并显示窗口后,将FormStyle设置为fsStayOnTop可以使它起作用。 我认为,诀窍是只有在窗口完全显示后才能执行此操作。

*visibleForm = new TForm3(Form3);
(*visibleForm)->FormStyle = fsStayOnTop;
SetWindowPos(_hYourWindow, HWND_TOPMOST, 0, 0, 0, 0,
    SWP_ASYNCWINDOWPOS|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_NOMOVE);

应该管用!

不知道我遇到的问题是否与您的相同,但是至少它有相同的症状。 通过将this->TopMost = trueInitializeComponent移到Form_Load来解决它。

为什么不只使用SetForegroundWindow()呢 出错的地方更少了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM