亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

讓應用程序只運行一個實例的實現方法

2020-01-26 16:17:19
字體:
來源:轉載
供稿:網友

在我們的程序當中如果要實現類似《360軟件管家》的功能,就要解決兩個問題,首先是要判斷該程序已有一個實例在運行,其次是要將已運行的應用程序實例激活,同時退出第二個應用程序實例。

對于第一個問題,我們可以通過設置命名互斥對象或命名信標對象,在程序啟動的時候檢測互斥對象或信標對象,如互斥對象或信標對象已存在,則可以判斷此程序已有一個實例正在運行。

第二個問題是如何找到已經運行的應用程序實例,如果我們能夠找到已運行實例主窗口的指針,即可調用SetForegroundWindow來激活該實例。我們可以通過兩種形式找到已運行實例的主窗口,一種形式是通過調用FindWindowEx去查找正在運行的窗口的句柄,這種方式用得比較多一些,而本文通過另一種形式去查找正在運行的窗口的句柄。通過調用SetProp給應用程序主窗口設置一個標記,用GetDesktopWindow 可以獲取Windows環境下的桌面窗口的句柄,所有應用程序的主窗口都可以看成該窗口的子窗口,接著我們就可以用GetWindow函數來獲得這些窗口的句柄。然后再用Win32 SDK函數GetProp查找每一個應用程序的主窗口是否包含有我們設置的標記,這樣就可以找到我們要找的第一個實例主窗口。

下面演示代碼是以一個單文檔應用程序為例,工程名字是Mutex。

復制代碼 代碼如下:

1、在應用程序類InitInstance()函數中判斷是否已有一個應用程序實例正在運行。

BOOL CMutexApp::InitInstance()

{

       //創建命名信標對象。

       HANDLE hSem=CreateSemaphore(NULL,1,1,"維新");

       if(hSem)  //信標對象創建成功。

       {

              //信標對象已經存在,則程序已有一個實例在運行。

              if(ERROR_ALREADY_EXISTS==GetLastError())

              {                 

                     CloseHandle(hSem);      //關閉信號量句柄。

 

//獲取桌面窗口的一個子窗口。

                     HWND hWndPrev=::GetWindow(::GetDesktopWindow(),GW_CHILD);  

 

                     while(::IsWindow(hWndPrev))

                     {

                     //判斷窗口是否有我們預先設置的標記,如有,則是我們尋找的窗口,并將它激活。

                            if(::GetProp(hWndPrev,"維新"))  

                            {

                            //如果主窗口已最小化,則恢復其大小。

                                   if (::IsIconic(hWndPrev))    

                                          ::ShowWindow(hWndPrev,SW_RESTORE);

 

                                   //將應用程序的主窗口激活。

                                   ::SetForegroundWindow(hWndPrev);

                                   return FALSE;                      //退出實例。

                            }

                            //繼續尋找下一個窗口。

                            hWndPrev = ::GetWindow(hWndPrev,GW_HWNDNEXT);

                     }

                   

                     AfxMessageBox("已有一個實例在運行,但找不到它的主窗口!");

              }

       }

       else

       {

              AfxMessageBox("創建信標對象失敗,程序退出!");

              return FALSE;

       }

 

       AfxEnableControlContainer();

 

       // Standard initialization

       // If you are not using these features and wish to reduce the size

       //  of your final executable, you should remove from the following

       //  the specific initialization routines you do not need.

     

#ifdef _AFXDLL

       Enable3dControls();                     // Call this when using MFC in a shared DLL

#else

       Enable3dControlsStatic();      // Call this when linking to MFC statically

#endif

 

       // Change the registry key under which our settings are stored.

       // TODO: You should modify this string to be something appropriate

       // such as the name of your company or organization.

       SetRegistryKey(_T("Local AppWizard-Generated Applications"));

 

       LoadStdProfileSettings();  // Load standard INI file options (including MRU)

 

       // Register the application's document templates.  Document templates

       //  serve as the connection between documents, frame windows and views.

 

       CSingleDocTemplate* pDocTemplate;

       pDocTemplate = new CSingleDocTemplate(

              IDR_MAINFRAME,

              RUNTIME_CLASS(CMutexDoc),

              RUNTIME_CLASS(CMainFrame),       // main SDI frame window

              RUNTIME_CLASS(CMutexView));

       AddDocTemplate(pDocTemplate);

 

       // Parse command line for standard shell commands, DDE, file open

       CCommandLineInfo cmdInfo;

       ParseCommandLine(cmdInfo);

 

       // Dispatch commands specified on the command line

       if (!ProcessShellCommand(cmdInfo))

              return FALSE;

 

       // The one and only window has been initialized, so show and update it.

       m_pMainWnd->ShowWindow(SW_SHOW);

       m_pMainWnd->UpdateWindow();

 

       return TRUE;

}

2、在框架類的OnCreate()函數中設置查找標記。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

       if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

              return -1;

     

       if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP

              | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

              !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

       {

              TRACE0("Failed to create toolbar/n");

              return -1;      // fail to create

       }

 

       if (!m_wndStatusBar.Create(this) ||

              !m_wndStatusBar.SetIndicators(indicators,

                sizeof(indicators)/sizeof(UINT)))

       {

              TRACE0("Failed to create status bar/n");

              return -1;      // fail to create

       }

 

       // TODO: Delete these three lines if you don't want the toolbar to

       //  be dockable

 

       m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

       EnableDocking(CBRS_ALIGN_ANY);

       DockControlBar(&m_wndToolBar);

 

     

       //設置查找標記。

       ::SetProp(m_hWnd,"維新",(HANDLE)1);

 

       return 0;

}

3、在程序退出是刪除設置的標記,在框架類中響應WM_DESTROY消息,進行處理。

void CMainFrame::OnDestroy()

{

       CFrameWnd::OnDestroy();

     

       // TODO: Add your message handler code here

       //刪除所設置的標記。

       ::RemoveProp(m_hWnd,"維新");

}

至此,使應用程序只運行一個實例的功能就完成了。

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本免费在线精品| 久久久91精品| 欧美精品在线免费播放| 国产精品白嫩初高中害羞小美女| 欧美激情视频播放| 亚洲精品久久久一区二区三区| 不卡中文字幕av| 久久久久久有精品国产| 亚洲美女又黄又爽在线观看| 国产精品久久久久久久美男| 国产一区二区香蕉| 亚洲最大激情中文字幕| 性亚洲最疯狂xxxx高清| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲精品在线不卡| 中文字幕精品网| 成人a在线观看| 亚洲精品国产美女| 国产精品久久久久影院日本| 国产成人精彩在线视频九色| 国产日韩一区在线| 国产亚洲精品日韩| 国产精品极品美女在线观看免费| 中文字幕欧美日韩| 久久久久日韩精品久久久男男| 91精品视频观看| 久久久久国产一区二区三区| 亚洲成人激情在线观看| 国产亚洲一区二区精品| 欧美日韩国产丝袜另类| 欧美孕妇与黑人孕交| 成人免费视频a| 亚洲一区二区久久久| 亚洲精品第一国产综合精品| 成人中文字幕+乱码+中文字幕| 欧美主播福利视频| 久久国产精品久久久久久| 亚洲人成电影网站色| 国产精品美女久久| 亚洲视频在线看| 久热99视频在线观看| 国产精品久久久91| 久久精品99久久久久久久久| 欧美中在线观看| …久久精品99久久香蕉国产| 亚洲成人中文字幕| 欧美午夜性色大片在线观看| 日韩免费av片在线观看| 欧美日韩在线观看视频| 97视频国产在线| 亚洲毛片在线免费观看| 欧美洲成人男女午夜视频| 亚洲成人黄色在线观看| 欧美精品制服第一页| 成人日韩av在线| 色综久久综合桃花网| 久久久精品一区| 欧美成人一二三| 国产69精品久久久久久| 疯狂欧美牲乱大交777| 日韩福利在线播放| 中文字幕日韩精品在线观看| 亚洲影视九九影院在线观看| 久久综合88中文色鬼| 欧美性猛交xxxx偷拍洗澡| 丝袜美腿精品国产二区| 午夜免费日韩视频| 国产精品视频地址| 亚洲欧美日韩综合| 欧美裸体男粗大视频在线观看| 国产成人黄色av| 精品亚洲一区二区三区四区五区| 91在线网站视频| 欧美激情videos| 亚洲精品中文字幕女同| 国产精品免费福利| 国产欧美va欧美va香蕉在线| 国产精品久久久久久久久粉嫩av| 欧美另类高清videos| 日韩中文字幕国产| 国产成人免费av| 亚洲欧美国产精品专区久久| 色偷偷9999www| 欧美精品成人91久久久久久久| 久久久999精品视频| 成人444kkkk在线观看| 中文字幕av一区二区| 国产精品稀缺呦系列在线| 亚洲人av在线影院| 亚洲精品狠狠操| 欧美激情久久久| 欧美极品欧美精品欧美视频| 色先锋资源久久综合5566| 欧美日韩国产精品一区二区三区四区| 欧美日韩亚洲一区二区三区| 亚洲国产成人精品久久| 日韩成人在线观看| 成人国产精品免费视频| 欧美一级片久久久久久久| 成人黄色影片在线| 日韩资源在线观看| 亚洲国产欧美在线成人app| 国产综合在线观看视频| 欧美另类xxx| 91香蕉国产在线观看| 欧美激情乱人伦| 久久国产精品电影| 国产中文日韩欧美| 国产精品com| 日韩精品极品在线观看播放免费视频| 日韩电视剧在线观看免费网站| 亚洲电影免费观看高清完整版| 免费91在线视频| 欧美激情一区二区三区久久久| 91中文在线观看| 亚洲第一级黄色片| 亚洲无亚洲人成网站77777| 日韩精品在线免费| 国产精品偷伦视频免费观看国产| 久操成人在线视频| 日韩欧美国产视频| 久久综合久久八八| 亚洲少妇激情视频| 国产亚洲精品久久久| 欧美精品www在线观看| 亚洲美女免费精品视频在线观看| 久久亚洲一区二区三区四区五区高| 欧美日韩国产限制| 伦理中文字幕亚洲| 日韩国产高清视频在线| 国产午夜精品视频免费不卡69堂| 亚洲国产精品系列| 精品久久久久久亚洲国产300| 精品久久久久久久久久国产| 日韩有码在线电影| 国产精品亚洲激情| 久久久久久久久久久免费| 精品视频在线播放色网色视频| 亚洲国产精品国自产拍av秋霞| 亚洲第一精品电影| 欧美一级视频免费在线观看| 亚洲成色777777女色窝| 精品毛片网大全| 国产精品美女www| 九九热这里只有精品6| 大荫蒂欧美视频另类xxxx| 久久免费在线观看| 国产精品综合久久久| 中文字幕在线精品| 精品久久久久久久中文字幕| 久久国产精品99国产精| 亚洲国产精久久久久久| 日韩免费在线看| 欧美另类老女人| 日韩有码在线视频| 日韩av免费在线观看| 97不卡在线视频| 97在线视频精品| 日韩黄色高清视频| 久久久久久久网站| 亚洲视频网站在线观看| 色香阁99久久精品久久久| 色综合久久中文字幕综合网小说| 国产成人av在线|