• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統計

            最新評論

            讓程序只運行一個實例的方法總結

            讓程序只運行一個實例的方法有數種,但原理都是相同的,就是在程序的主窗口創建之前,檢查系統中是否已經存在某個與本程序相關的特定標志了。如果存在,則說明已經有一個實例在運行了,當前程序不用創建主窗口,直接退出即可。否則,就說明本程序是第一次運行。各種方法所不同的是,各自檢查的標志不同,這也使得各種方法在使用時各有利弊了。

            一般來說,使程序只運行一個實例的最簡單的方法當然是使用FindWindow()查找主窗口,如果主窗口已經存在了,當然說明已經有一個實例運行了。代碼如下:

            // 主窗口創建前
            HWND hWnd = FindWindow("ClassName", "Caption");
            if(IsWindow(hWnd))
            {
                   ShowWindow(hWnd, SW_NORMAL);     // 顯示
                   SetForegroundWindow(hWnd);                  // 激活
                   return;
            }

            這個方法的不足之處是,FindWindow()的參數ClassName和Caption比較難取得。比如,凡是使用DialogBoxParam()創建的對話框,他們的ClassName都是“#32770”,沒有性;而使用MFC創建的Doc/View結構的窗口的Caption更是會隨Doc?Name的不同而有所變化。

            種方法就是使用Mutex互斥體了。代碼如下:

            // 聲明全局的局柄
            HANDLE g_hHandle;
            // 主窗口創建前
            g_hHandle = CreateMutex(NULL, FALSE, "Mutex Name");
            if(GetLastError() == ERROR_ALREADY_EXISTS)
            {
                  return FALSE;
            }

            使用Mutex代碼比較簡潔,但是此時不能取得已經啟動實例窗口局柄,因此無法激活已經啟動實例窗口。

            第三種方法是我認為比較完善的方法,就是通過SetProp()為程序主窗口設置一個特殊的Property,然后在啟動時遍歷所有的窗口,找出包含著個Property的窗口局柄。這個方法的缺點就是代碼比較多。如下:

            // 聲明全局的property名和property value
            LPCTSTR g_szPropName = "prop name";
            HANDLE g_hValue = (HANDLE)1;
            // 定義枚舉窗口回調函數
            BOOL CALLBACK EnumWndProc(HWND?hwnd,?LPARAM?lParam)
            {
            ???????HANDLE?h?=?GetProp(hwnd,?g_szPropName);
            ???????if(?h?==?g_hValue)
            ???????{
            ?????????????*(HWND*)lParam?=?hwnd;
            ?????????????return?false;
            ???????}
            ???????return?true;
            }

            //?主窗口創建前判斷
            HWND?hWnd?=?NULL;
            EnumWindows(EnumWndProc,?(LPARAM)&hWnd);
            if(IsWindow(hWnd))
            {
            ??????ShowWindow(hWnd,?SW_NORMAL);
            ??????SetForegroundWindow(hWnd);
            ??????return?FALSE;
            }

            //?主窗口創建后設置
            SetProp(m_hWnd,?g_szPropName,?g_hValue);

            這個方法就是需要遍歷系統中所有的窗口,效率可能稍低了些。

            posted on 2008-07-30 14:48 大龍 閱讀(865) 評論(0)  編輯 收藏 引用

            国产国产成人精品久久| 国产高清美女一级a毛片久久w | 区久久AAA片69亚洲| 亚洲va中文字幕无码久久不卡| 97久久久久人妻精品专区| 99热成人精品免费久久| 亚洲中文字幕久久精品无码APP | 久久99久久99小草精品免视看| 久久精品中文字幕一区| 久久国产色AV免费看| 人妻无码精品久久亚瑟影视| 久久综合给合久久狠狠狠97色69| 久久亚洲精品无码观看不卡| 亚洲国产精品久久久久网站| 99蜜桃臀久久久欧美精品网站| 久久99国产精品成人欧美| 性做久久久久久久| 日韩人妻无码一区二区三区久久99 | 狠狠色丁香婷综合久久| 女人高潮久久久叫人喷水| 国产午夜精品久久久久九九| 亚洲色婷婷综合久久| 久久久精品久久久久影院| 国产精品久久久久久久午夜片| 久久91精品久久91综合| 久久久久AV综合网成人| 久久亚洲国产成人精品性色| 婷婷五月深深久久精品| 亚洲综合伊人久久综合| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久亚洲欧洲国产综合| 久久亚洲电影| 久久婷婷国产剧情内射白浆| 久久无码AV中文出轨人妻| 热RE99久久精品国产66热| 人人狠狠综合久久亚洲| 伊人久久国产免费观看视频 | 亚洲欧美日韩精品久久亚洲区 | 国产A级毛片久久久精品毛片| 国产综合久久久久| 国产精品成人久久久久久久 |