如何将我的Qt应用程序主窗口始终放在Windows的任务栏上方?

时间:2016-09-28 12:38:49

标签: c++ windows qt qt5 taskbar

我有一个Qt应用程序,它仍然在其他窗口之上。主窗口是无框架和透明的。把它放在其他窗口之上我遵循以下程序。

SetForegroundWindow((HWND)winId());
Qt::WindowFlags flags = this->windowFlags();
flags = flags & ~Qt::WindowMinimizeButtonHint;
this->setWindowFlags(flags|Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint );
ui.setupUi(this);

此代码段将我的Qt主窗口置于所有窗口之上,也位于任务栏之上。 问题是,无论何时单击任务栏的任何区域,任务栏上的主窗口区域都会在任务栏后面。任务栏出现在前面。主窗口仍然高于所有其他窗口。我的主窗口的底部区域似乎已经落后于任务栏。

如何阻止任务栏推动主窗口区域?我希望将窗口保持在窗口上方以及任务栏上方。

3 个答案:

答案 0 :(得分:2)

你不能。 Qt::WindowsStaysOnTopHint标记了一个具有WS_EX_TOPMOST窗口样式的窗口,所有这些窗口都可以位于彼此之上。请参阅Raymond Chen在The Old New Thing偶尔的咆哮。

最好的办法是限制窗口的位置,使其无法移动到任务栏的顶部。

答案 1 :(得分:0)

如果您可以访问windows api或Qt具有等效功能,您可以使用SetWindowPos

例如

SetWindowPos(hWnd, ((HWND)-1), 0, 0, width, height, 0); 

其中hWnd是窗口的句柄,宽度和高度是屏幕的宽度和高度(如果你想全屏显示)。将-1作为HWND传递将使窗口位于所有其他非最顶层窗口之上。即使在停用窗口后它也会保持在顶部。

答案 2 :(得分:0)

感谢您的回答。感谢Martin Bonner提供博客The Old New Thing的参考。

我尝试了一种替代方法,使用计时器并将窗口抬到其他任务栏上。我的窗口是完全透明的,无框架,没有标题栏和状态栏。它只包含一个矩形边框和底部的一些按钮。

我在任务栏上方每500毫秒升起一个窗口。因此,如果用户点击任务栏中的任何区域,则任务栏后面的窗口部分会再次出现在前面。

if (this->isActiveWindow() == false)
    this->raise();

是的,如果任何其他应用程序使用类似的方法将自己提升到任务栏之上,这种提升窗口的方式可能会引发竞争。 所以我想确保这个方法正常工作两个具有类似方法的应用程序不应该一起运行。