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_MAXIMIZE
SetForegroundWindow(handle);//啟用視窗在桌面最前面
return 1;
}
//@ 3.若程式未開啟,則正常執行程式,如以下遮蔽的程式碼,正常啟動主介面程式
//TMainWindow w;
//w.show();
//int ret = a.exec();
return 0;
}
相關文章
- WPF將視窗置於桌面下方(可用於動態桌面)
- qt設定視窗在桌面居中顯示QT
- Qt+ECharts開發筆記(二):Qt視窗動態調整大小,使ECharts跟隨Qt視窗大小變換QTEcharts筆記
- Qt視窗居中QT
- QT視窗類QT
- qt介面佈局之使視窗顯示出現在正中間位置QT
- “雙擊Windows7桌面上快捷方式變成檢視屬性”問題的處理辦法Windows
- 鮑爾默:Linux並未擊倒視窗系統Linux
- qt 視窗預設居中QT
- qt視窗居中顯示QT
- Qt TCP (小型聊天視窗)QTTCP
- Go Qt5 建立空白視窗、視窗居中及關閉視窗事件GoQT事件
- wpf雙擊窗體不進loaded事件程式碼事件
- Qt 佈局管理 - 停靠視窗QT
- Qt入門(14)——父視窗部件和子視窗部件QT
- 用java 能建立桌面快捷方式嗎?Java
- Windows7系統下如何快速啟用程式視窗Windows
- 如何在Windows下啟動Koa並隱藏視窗Windows
- Robot Framework-Ride建立桌面快捷方式(最簡單!)FrameworkIDE
- Qt 設定視窗居中顯示QT
- Qt5:視窗居中顯示QT
- Qt入門(15)——使用視窗部件QT
- Qt視窗螢幕居中顯示QT
- 【QT】QT如何讓視窗放置在螢幕正中間QT
- 用BCB在windows桌面建立快捷方式 (轉)Windows
- Qt的視窗背景及視窗風格統一與煥膚QT
- 怎麼用spyder雙擊開啟py檔案
- Qt5應用改變視窗大小時出現黑影QT
- Qt中設定視窗居中顯示QT
- Qt入門(16)——組裝視窗部件QT
- Qt入門(19)——自定義視窗部件QT
- QT 讓視窗(或控制元件)居中QT控制元件
- 視窗增強工具:Rectangle Pro啟用版
- Dock視窗預覽工具:DockView 啟用版View
- 浮動應用程式視窗怎麼用?
- win10怎麼建立桌面快捷方式_win10新增程式快捷方式到桌面的步驟Win10
- win10 如何將視窗置頂 win10怎麼設定視窗置頂Win10
- JS取得不同連線的地址,並開啟新視窗JS