當前位置:網站首頁>Qt程序設置不重複打開該程序

Qt程序設置不重複打開該程序

2022-01-27 15:47:48 xiaoyaoyou.xyz

Qt程序設置不重複打開該程序


對於已經打開的Qt桌面程序,我們希望用戶再次雙擊桌面的快捷方式時,程序可以自動激活到其他所有程序的最前面,而不是重新打開一次程序。
此時我們采用QSharedMemory方式,加上Window API函數操作程序,保證已打開程序不重複打開,並激活程序窗口到最前面

在main()函數中添加如下代碼

// 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, (LPCWSTR)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;
}

版權聲明
本文為[xiaoyaoyou.xyz]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201271547478372.html

隨機推薦