读书人

如何只运行一个实例

发布时间: 2013-07-04 11:45:33 作者: rapoo

怎么只运行一个实例
网上找了些帖子
说这样子HWND hWnd = FindWindow(NULL, _T("TestTree"));
if(IsWindow(hWnd))
{
ShowWindow(hWnd, SW_NORMAL); // 显示
SetForegroundWindow(hWnd); // 激活
return FALSE;
} 不太明白
放在OnInitDialog()中也没有效果,求大神们讲讲有什么好的办法!! 实例
[解决办法]

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) {
//...
#ifdef SINGLE_INSTANCE
HANDLE hMutex;
hMutex = CreateMutex(NULL, FALSE, "MySigleInstance" );
if ( WaitForSingleObject(hMutex, 1000) == WAIT_TIMEOUT ) {
// There is another instance out there, but it is taking to long to
// locate, just exit
return FALSE;
}
if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
ReleaseMutex(hMutex);
return FALSE;
}
#endif
//...
#ifdef SINGLE_INSTANCE
ReleaseMutex(hMutex);
CloseHandle(hMutex);
#endif
return 0;
}


[解决办法]
以MFC对话框程序为例,在App类定义如下变量和函数
//添加的标识只运行一次的属性名
CString g_szPropName = "MyAppName"; //自己定义一个属性名
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;
}

在InitInstance()中添加如下代码
HWND oldHWnd = NULL; 
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚举所有运行的窗口
if(oldHWnd != NULL)
{
::ShowWindow(oldHWnd,SW_SHOWNORMAL); //激活找到的前一个程序
::SetForegroundWindow(oldHWnd); //把它设为前景窗口


return FALSE; //退出本次运行
}



在主对话框的OnInitDialog()的开头添加
SetProp(m_hWnd,g_szPropName,g_hValue);


g_szPropName,g_hValue自己添加extern扩展一下作用范围

读书人网 >C++

热点推荐