• <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>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            讓程序只運(yùn)行一個(gè)實(shí)例的方法總結(jié)

            讓程序只運(yùn)行一個(gè)實(shí)例的方法有數(shù)種,但原理都是相同的,就是在程序的主窗口創(chuàng)建之前,檢查系統(tǒng)中是否已經(jīng)存在某個(gè)與本程序相關(guān)的特定標(biāo)志了。如果存在,則說明已經(jīng)有一個(gè)實(shí)例在運(yùn)行了,當(dāng)前程序不用創(chuàng)建主窗口,直接退出即可。否則,就說明本程序是第一次運(yùn)行。各種方法所不同的是,各自檢查的標(biāo)志不同,這也使得各種方法在使用時(shí)各有利弊了。

            一般來說,使程序只運(yùn)行一個(gè)實(shí)例的最簡單的方法當(dāng)然是使用FindWindow()查找主窗口,如果主窗口已經(jīng)存在了,當(dāng)然說明已經(jīng)有一個(gè)實(shí)例運(yùn)行了。代碼如下:

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

            這個(gè)方法的不足之處是,F(xiàn)indWindow()的參數(shù)ClassName和Caption比較難取得。比如,凡是使用DialogBoxParam()創(chuàng)建的對(duì)話框,他們的ClassName都是“#32770”,沒有性;而使用MFC創(chuàng)建的Doc/View結(jié)構(gòu)的窗口的Caption更是會(huì)隨Doc?Name的不同而有所變化。

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

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

            使用Mutex代碼比較簡潔,但是此時(shí)不能取得已經(jīng)啟動(dòng)實(shí)例窗口局柄,因此無法激活已經(jīng)啟動(dòng)實(shí)例窗口。

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

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

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

            //?主窗口創(chuàng)建后設(shè)置
            SetProp(m_hWnd,?g_szPropName,?g_hValue);

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

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


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久国产欧美日韩精品免费| 久久精品无码午夜福利理论片| 伊人色综合久久天天| 中文字幕久久欲求不满| 久久久久无码专区亚洲av| 精品99久久aaa一级毛片| 欧美激情精品久久久久久久九九九| 三级韩国一区久久二区综合| 伊人久久久AV老熟妇色| 国产99久久精品一区二区| 久久久久久久综合日本| 7777精品久久久大香线蕉| 国产亚洲精品自在久久| 色8激情欧美成人久久综合电| 色欲综合久久躁天天躁蜜桃| 中文字幕久久欲求不满| 国产精品中文久久久久久久| 狠狠88综合久久久久综合网| 亚州日韩精品专区久久久| 2021精品国产综合久久| 伊人久久大香线蕉综合热线| 人人狠狠综合久久亚洲88| 亚洲中文字幕无码久久精品1| 99久久精品国产毛片| 久久婷婷五月综合97色一本一本| 国内精品伊人久久久久网站| 久久狠狠高潮亚洲精品| 亚洲香蕉网久久综合影视 | 日韩精品国产自在久久现线拍| 日批日出水久久亚洲精品tv| 国产精品久久久久久久久| 中文精品久久久久人妻不卡| 久久久精品人妻无码专区不卡| 7国产欧美日韩综合天堂中文久久久久 | 久久久久亚洲AV无码专区体验| 国内精品伊人久久久影院| 久久综合久久鬼色| 亚洲?V乱码久久精品蜜桃| 久久露脸国产精品| 国産精品久久久久久久| 中文精品久久久久国产网址|