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+ECharts開發筆記(二):Qt視窗動態調整大小,使ECharts跟隨Qt視窗大小變換QTEcharts筆記
- QT視窗類QT
- qt介面佈局之使視窗顯示出現在正中間位置QT
- Qt TCP (小型聊天視窗)QTTCP
- wpf雙擊窗體不進loaded事件程式碼事件
- 非啟用視窗(Inactive Window)
- Go Qt5 建立空白視窗、視窗居中及關閉視窗事件GoQT事件
- Robot Framework-Ride建立桌面快捷方式(最簡單!)FrameworkIDE
- 如何在Windows下啟動Koa並隱藏視窗Windows
- Qt 設定視窗居中顯示QT
- 【QT】QT如何讓視窗放置在螢幕正中間QT
- 開源專案 Qt Esay Designer (Qt視窗設計器)QT
- win10怎麼建立桌面快捷方式_win10新增程式快捷方式到桌面的步驟Win10
- Dock視窗預覽工具:DockView 啟用版View
- 視窗增強工具:Rectangle Pro啟用版
- 怎麼用spyder雙擊開啟py檔案
- win10 如何將視窗置頂 win10怎麼設定視窗置頂Win10
- qt的無邊框視窗支援拖拽、Aero Snap、視窗陰影等特性QT
- Qt 讓彈出的視窗居中顯示QT
- Qt5.12視窗螢幕居中顯示QT
- 如何在 Ubuntu 桌面手動新增應用快捷方式Ubuntu
- 滑動視窗與雙指標指標
- Mac雙視窗檔案管理:MaxCommanderMac
- 視窗程式框架框架
- Windows API視窗程式設計 - 空白視窗WindowsAPI程式設計
- Qt如何寫一個三秒自動消失提示窗,適用於窗體和tableView中QTView
- win10遠端桌面連線 遠端桌面視窗全屏Win10
- Qt 彈窗置頂國定尺寸大小等樣式設定QT
- Flink的滾動視窗、會話視窗、滑動視窗及其應用會話
- Canonical通過Flutter啟用Linux桌面應用程式支援FlutterLinux
- 用Java編寫一個最簡單的桌面程式Java
- vue開啟新視窗並且實現傳參,有圖有真相Vue
- 視窗程式的框架框架
- Mac小技巧 快速檢視指定應用程式的所有視窗Mac
- 廣告彈窗/小視窗程式碼
- js 開啟新視窗方式JS
- 無法開啟JFrame視窗