Qt双击桌面快捷方式激活并使程序窗口置于最前端
方法二轉載:https://blog.csdn.net/winstonyi/article/details/108737600
qt在桌面應用程序中,會存在一個問題,官方示例中也無提及,桌面快捷方式,喚醒已經最小化的窗口,因為大部分情況下,不可能讓窗口一直保持在前臺,最小化后,在需要時有必須讓其快速顯示,windows托盤圖標在某些情況下,受圖標緩沖影響,就是不顯示!最直接和可靠的渠道就是,桌面快捷方式和開始菜單的快捷方式,也比較符合大部分普通用戶習慣!
?
方法一:
?起初遇到該問題,我們測試,直接雙擊桌面快捷方式,默認是相當于“雙開”,也就說打開同樣的程序的第二個,對于有端口號等應用程序,明顯會出錯,因為都被一個占了,和同事試了各種方法,最多只能用QSharedMemory忽略再次打開這個動作,保證無法重復打開,無法喚醒已經最小化到托盤的窗口。
后來無意間,在現場商量到了一個實現方式,是通過udp消息喚醒窗口。每次打開程序,默認給指定端口,發出特定消息,已經運行的應用程序收到該消息后,主動showwindow,實現了,打開桌面快捷方式,喚醒已經最小化的窗口;
方法二:
博主Chervin(https://blog.csdn.net/winstonyi/article/details/108737600),在2020年9月開源了,新的方法,采用QSharedMemory方式,加上Window API函數操作程序,保證已打開程序不重復打開,并激活程序窗口到最前面。
仔細看其原理,應該是合理的解決方案。
可能qt的大多人對windows?api并不熟悉,下為實現方法,可自行參考,
// Windouw API 依賴頭文件 #include <windows.h> #include <winbase.h>// Qt 依賴頭文件 #include <QSystemSemaphore> #include <QSharedMemory> int main(int argc, char *argv[]) {// ......//.....其他代碼/** 程序是否已經打開檢測和激活并置于最前端控制 *///@ 1.首先判斷程序是否已經打開QSystemSemaphore semaphore("BTSemap", 1);semaphore.acquire();QSharedMemory shareMemory("BTKey");//建立共享內存對象,BTKey為改程序設置的共享內存key值,用戶根據自己需要設定bool isRunning =false;if (shareMemory.attach())//判斷軟件是否已經打開{isRunning = true;//已經打開}else{shareMemory.create(1);//軟件未打開,則創建共享內存isRunning = false;}semaphore.release();//@ 2.軟件已經打開,則將軟件激活,并置于桌面最前面if (isRunning){//@ 將軟件激活,顯示在最前端QString wTitle = QString("TestProgram");//Qt創建的主MainWindow的 標題HWND handle = FindWindow(nullptr,wTitle.toLocal8Bit().toStdString().c_str());//基于windows Api 獲取程序窗口的句柄if (handle == nullptr)//判斷是否為空{return -1;}ShowWindow(handle, SW_RESTORE);//激活窗口,參數:SW_RESTORE,以程序之前的大小顯示,可以根據需要設置其他標識,如SW_MAXIMIZESetForegroundWindow(handle);//激活窗口在桌面最前面return 1;}//@ 3.若程序未打開,則正常執行程序,如以下屏蔽的代碼,正常啟動主界面程序//TMainWindow w;//w.show();//int ret = a.exec();return 0; }?
總結
以上是生活随笔為你收集整理的Qt双击桌面快捷方式激活并使程序窗口置于最前端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1-Qt6在线安装图文步骤
- 下一篇: 上网速度快的浏览器_2020年浏览器国内