簡體   English   中英

如何將Qt應用程序主窗口始終置於Windows任務欄上方?

[英]How can I put my Qt Application mainwindow always above the taskbar in Windows?

我有一個Qt應用程序,它保留在其他窗口的頂部。 主窗口是無框透明的。 要將其置於其他窗口之上,我已按照以下過程進行操作。

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

此代碼段將Qt主窗口置於所有窗口的頂部,也位於任務欄的上方。 問題是,每當單擊任務欄的任何區域時,任務欄上的主窗口區域就會在任務欄后面。 任務欄位於最前面。 主窗口仍然保留在所有其他窗口之上。看來我主窗口的底部區域已經在任務欄后面了。

如何防止任務欄將主窗口區域推到自身后面? 我想將窗口保持在所有窗口上方以及任務欄上方。

你不能 Qt::WindowsStaysOnTopHintWS_EX_TOPMOST窗口樣式標記一個窗口,並且所有這些窗口可以彼此WS_EX_TOPMOST “舊的新事物”中看到雷蒙德陳偶爾聽到的咆哮。

最好的選擇是限制窗口的位置,以便不能將其移到任務欄的頂部。

如果您可以訪問Windows api或Qt具有等效功能,則可以使用SetWindowPos

例如

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

其中hWnd是窗口的句柄,而width和height是屏幕的寬度和高度(如果要全屏顯示)。 將-1作為HWND傳遞會將窗口置於所有其他非最上面的窗口之上。 即使禁用了窗口,它也將保留在頂部。

感謝您的回答。 感謝Martin Bonner為博客The Old New Thing提供參考。

我通過使用計時器並在其他任務欄上抬起我的窗口來嘗試其他方法。 我的窗口是完全透明的,沒有標題欄和狀態欄的無框架。 它僅包含一個矩形邊框,底部包含一些按鈕。

我在任務欄上方每500ms升高一次窗口。 因此,如果用戶單擊任務欄上的任何區域,則窗口在任務欄后面的部分將再次顯示在前面。

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

是的,如果任何其他應用程序正在使用類似的方法將自己提升到任務欄上方,則這種升高窗口的方式可能會引起條件競合。 因此,我想確保該方法正確運行,不應將具有相似方法的兩個應用程序同時運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM