首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 捕獲桌面圖標雙擊啟動事件:命令行參數區分首次啟動與喚醒

     編輯:程式設計綜合問答

需求:MFC 程序最小化到托盤/後台,雙擊桌面快捷方式/可執行文件時,不啟動新實例,而是顯示/恢復已有主窗口。

核心機制:互斥體防止多實例 + 命令行參數標識喚醒

  1. 啟動時創建命名互斥體:
    CMutex mutex(FALSE, _T("Global\\MyAppUniqueMutexName"), &bCreated);
    若 !bCreated (互斥體已存在) → 已有實例運行。
  2. 已有實例:發送喚醒消息或命令行參數:
    方案 A:FindWindow 找到主窗口 → PostMessage(WM_USER_SHOW)。
    方案 B (配合快捷方式):**快捷方式屬性 → 目標末尾添加參數** /restore。
    啟動時解析命令行:

BOOL CMyApp::InitInstance() {
    CMutex mutex(FALSE, _T("Global\\MyAppMutex"), &bCreated);
    if (!bCreated) {
        // 已運行,發送喚醒
        CWnd* pWnd = CWnd::FindWindow(_T("MyMainFrameClass"), NULL);
        if (pWnd) pWnd->PostMessage(WM_USER_RESTORE);
        return FALSE; // 退出當前實例
    }
    
    // 解析命令行參數
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    // 若需區分「雙擊快捷方式喚醒」與「命令行帶參啟動」,可自定義參數
    // m_lpCmdLine 獲取完整命令行字符串
    if (strstr(m_lpCmdLine, "/restore")) {
        // 標記主窗口初始化時調用 ShowWindow(SW_RESTORE)
    }
    // ... 正常初始化
}

桌面快捷方式配置

  • 右鍵快捷方式 → 屬性 → 目標:"C:\Path\MyApp.exe" /restore
  • 用戶雙擊此快捷方式 → 命令行帶 /restore → 程序邏輯識別為喚醒操作。

主窗口處理喚醒消息


LRESULT CMainFrame::OnUserRestore(WPARAM, LPARAM) {
    if (IsIconic()) ShowWindow(SW_RESTORE);
    SetForegroundWindow();
    return 0;
}

**關鍵點**:互斥體保證單實例,命令行參數/消息傳遞喚醒意圖,主窗口響應恢復顯示。此為 Windows 桌面應用標準單實例喚醒模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved