首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

如何只运行一个实例

2013-07-04 
怎么只运行一个实例网上找了些帖子说这样子HWND hWnd FindWindow(NULL, _T(TestTree))if(IsWindow(hW

怎么只运行一个实例
网上找了些帖子
说这样子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扩展一下作用范围

热点排行