如何只运行一个实例
怎么只运行一个实例
网上找了些帖子
说这样子HWND hWnd = FindWindow(NULL, _T("TestTree"));
if(IsWindow(hWnd))
{
ShowWindow(hWnd, SW_NORMAL); // 显示
SetForegroundWindow(hWnd); // 激活
return FALSE;
} 不太明白
放在OnInitDialog()中也没有效果,求大神们讲讲有什么好的办法!!
------解决方案--------------------
------解决方案--------------------
以MFC对话框程序为例,在App类定义如下变量和函数
在InitInstance()中添加如下代码
网上找了些帖子
说这样子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); //把它设为前景窗口