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