vc实现唯一进程
我们的程序经常需要实现唯一实例的效果。
主要涉及几个api
HWND FindWindow( LPCTSTR lpClassName, /*pointer to class name*/ LPCTSTR lpWindowName /*pointer to window name*/ );
BOOL IsIconic( HWND hWnd /* handle to window*/ );
BOOL SetForegroundWindow( HWND hWnd // handle to window to bring to foreground );
主要原理:
- 通过标题找到窗口句柄
- 调用 GetLastActivePopup,是否有弹出的子窗口,如果没有会返回本身
- 调用 SetForegroundWindow 激活
- 然后本身程序退出,这样就保证了唯一实例
//linbc add on 20090619
HWND pWndPrev, pWndChild;
pWndPrev = ::FindWindow(NULL,"XX保险公司业务管理系统");
if(pWndPrev != NULL){
pWndChild = ::GetLastActivePopup(pWndPrev);
// 是否最小化
if (::IsIconic(pWndPrev))
::ShowWindow(pWndPrev,SW_RESTORE);
::SetForegroundWindow(pWndChild);
return FALSE;
}
HWND pWndPrev, pWndChild;
pWndPrev = ::FindWindow(NULL,"XX保险公司业务管理系统");
if(pWndPrev != NULL){
pWndChild = ::GetLastActivePopup(pWndPrev);
// 是否最小化
if (::IsIconic(pWndPrev))
::ShowWindow(pWndPrev,SW_RESTORE);
::SetForegroundWindow(pWndChild);
return FALSE;
}