什么时候在窗口上设置最顶层不能工作?

时间:2010-11-08 05:06:22

标签: c++ windows winapi

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

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

5 个答案:

答案 0 :(得分:1)

SetWindowPos静默无法设置WS_EX_TOPMOST的一种方式是当进程在创建时间窗口或调用SetWindowPos时没有对SetForegroundWindow的权限时。这可以说是你想要窗口最顶端的时间之一(可以说是你不应该被允许的次数之一)。

自从Vista发布以来,谣言已被MS关闭。

这种限制是可以理解的 - 你不希望随机过程中最顶层的窗口在没有业务的情况下窃取焦点。

一个合理用例的解决方法,当一个进程间接启动一个帮助程序进程时(就像在父进程中启动安装然后从msiexec启动辅助进程一样)并且helper然后想要最顶层甚至抓取输入是使用AllowSetForegroundWindow。

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

答案 1 :(得分:0)

我使用Borland C ++ Builder遇到了类似的问题。在创建和显示窗口后,我通过将FormStyle设置为fsStayOnTop来实现此功能。我认为诀窍是只有在窗口完全显示后才能这样做。

*visibleForm = new TForm3(Form3);
(*visibleForm)->FormStyle = fsStayOnTop;

答案 2 :(得分:0)

SetWindowPos(_hYourWindow, HWND_TOPMOST, 0, 0, 0, 0,
    SWP_ASYNCWINDOWPOS|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_NOMOVE);

应该工作!

答案 3 :(得分:0)

不知道我的问题是否和你的一样,但至少它有相同的症状。通过将this->TopMost = trueInitializeComponent移至Form_Load来解决此问题。

答案 4 :(得分:0)

为什么不使用SetForegroundWindow()。出错的次数要少得多......