Qt雙擊桌面快捷方式啟用並使程式視窗置於最前端

閆有盡意無瓊發表於2020-12-17

方法二轉載:https://blog.csdn.net/winstonyi/article/details/108737600

qt在桌面應用程式中,會存在一個問題,官方示例中也無提及,桌面快捷方式,喚醒已經最小化的視窗,因為大部分情況下,不可能讓視窗一直保持在前臺,最小化後,在需要時有必須讓其快速顯示,windows托盤圖示在某些情況下,受圖示緩衝影響,就是不顯示!最直接和可靠的渠道就是,桌面快捷方式和開始選單的快捷方式,也比較符合大部分普通使用者習慣!

 

方法一:

 起初遇到該問題,我們測試,直接雙擊桌面快捷方式,預設是相當於“雙開”,也就說開啟同樣的程式的第二個,對於有埠號等應用程式,明顯會出錯,因為都被一個佔了,和同事試了各種方法,最多隻能用QSharedMemory忽略再次開啟這個動作,保證無法重複開啟,無法喚醒已經最小化到托盤的視窗。

後來無意間,在現場商量到了一個實現方式,是通過udp訊息喚醒視窗。每次開啟程式,預設給指定埠,發出特定訊息,已經執行的應用程式收到該訊息後,主動showwindow,實現了,開啟桌面快捷方式,喚醒已經最小化的視窗;

方法二:

博主Chervinhttps://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_MAXIMIZE
            SetForegroundWindow(handle);//啟用視窗在桌面最前面
        return 1;
    }
    
	//@ 3.若程式未開啟,則正常執行程式,如以下遮蔽的程式碼,正常啟動主介面程式
    //TMainWindow w;
    //w.show();
    //int ret =  a.exec();

	return 0;
}

 

相關文章