gpt4 book ai didi

c++ - 什么时候在窗口上设置最顶层不起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 12:22:40 24 4
gpt4 key购买 nike

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

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

最佳答案

SetWindowPos 无法设置 WS_EX_TOPMOST 的一种方式是当进程在创建窗口或调用 SetWindowPos 时没有权限使用 SetForegroundWindow。这可以说是您希望窗口位于最顶部的时间之一(并且可以说是您不应该被允许的时间之一)。

有传言说 MS 从 Vista 开始就堵住了这个漏洞。

限制是可以理解的——您不希望来自随机进程的最顶层窗口在它们也没有业务时窃取焦点。

当一个进程间接启动辅助进程时(例如在父进程中启动安装然后从 msiexec 启动辅助进程的情况)并且辅助程序然后想要成为最顶层甚至获取输入的合理用例的解决方法是使用 AllowSetForegroundWindow。

显然,您需要拥有专注的权利才能放弃它。

关于c++ - 什么时候在窗口上设置最顶层不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com