首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

單一實例應用程式:啟動時檢測並自動激活既有視窗

     編輯:關於VC++

確保應用程式全系統僅運行一個實例,第二次啟動時尋找既有主視窗並將其還原、置於前景。核心技術:視窗屬性(SetProp/GetProp)標記主視窗 + EnumWindows 枚舉搜尋。

實作三步驟

1. 定義唯一屬性名稱與值

CString g_szPropName = _T("MyApp_Unique_Prop_Name_8393"); // 唯一字串
HANDLE g_hPropValue = (HANDLE)1; // 任意非零值

2. InitInstance 中枚舉視窗檢測

BOOL CMyApp::InitInstance() {
    HWND hExisting = NULL;
    EnumWindows([](HWND hwnd, LPARAM lParam) -> BOOL {
        if (GetProp(hwnd, g_szPropName) == g_hPropValue) {
            *(HWND*)lParam = hwnd; return FALSE; // 停止枚舉
        }
        return TRUE;
    }, (LPARAM)&hExisting);

    if (hExisting) {
        ShowWindow(hExisting, SW_SHOWNORMAL); // 還原最小化
        SetForegroundWindow(hExisting);       // 置前景
        return FALSE; // 退出第二個實例
    }
    // ... 繼續正常初始化
    return TRUE;
}

3. 主視窗 OnInitDialog 設定屬性

BOOL CMainDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    SetProp(m_hWnd, g_szPropName, g_hPropValue); // 標記自己
    return TRUE;
}

關鍵點

  • 屬性名稱需極度唯一(建議加入 GUID 片段),避免與其他程式衝突。
  • SetForegroundWindow 需符合前景鎖定規則(Windows 2000/XP 允許從非前景程式喚醒前景視窗)。
  • 若主視窗為模態對話框,確保在 DoModal 前設定屬性,或在建立視窗後立即設定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved