Windows中的活动窗口和QWidget :: activateWindow()

QWidget::activateWindow()的Qt文档声明:

在Windows上,如果你正在调用这个应用程序当前不是活动的,那么它将不会使它成为活动窗口。 它将更改任务栏条目的颜色以指示窗口已经以某种方式更改。 这是因为Microsoft不允许应用程序中断用户当前正在其他应用程序中执行的操作。

但是,Skype似乎违背了这个规则。 如果Skype正在运行,但不是活动的应用程序,我可以从开始菜单启动它,它将现有的实例带到前台,激活它,并抓住input焦点。

该怎么做?

注意:这是QtSingleApplication的工作原理

解决方案对我的问题来说非常简单。 只需调用AllowSetForegroundWindow(ASF_ANY); 在应用程序开始的时候,原来的过程将被允许通过使用SetForegroundWindow()来使自己处于前台。 没有奇怪的黑客,只需添加一行代码,也不需要修改QtSingleApplication。

我不认为你可以单靠Qt API来可靠地做到这一点。

有多种解决方案的Windows。 例如在这里 , 在这里 , 在这里 。

我之前使用的方法是声明一个共享内存部分 ,并在那里写应用程序的窗口句柄。 稍后,当程序的第二个实例启动时,可以找到第一个窗口句柄并激活它。

我不认为你在这种情况下有Windows阻止你这样做的问题,因为你的第二个实例是活动的应用程序,所以它被允许“传递焦点”到其他窗口。

在Qt解决方案中使用单一应用程序

对于某些应用程序来说,它们仅由任何用户启动一次是有用的,甚至是至关重要的。 未来的尝试启动应用程序应激活任何已经运行的实例,并可能执行请求的操作,例如加载文件,在这种情况下。

你可以设置setWindowOpacity从0到1.唯一的事情是你可以随时打开它