最近在研究如何只运行程序的一个实例,当第二次运行时,激活已经存在的进程的方法,其中一个方法就是通过GetWindow()函数来枚举窗口,然后依次调用GetPorp()函数来获取属性值,值为进程设置的值时,表示该窗口就是我们要查找的窗口,在BOOL CCTestApp::InitInstance()中加入以下代码
m_hMutex = CreateMutex(NULL,TRUE,_T("test"));
if (m_hMutex == NULL)
{
return FALSE;
}
//如果程序已经存在并且正在运行
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
//获取桌面窗口的一个子窗口。
HWND hWndPrev=::GetWindow(::GetDesktopWindow(),GW_CHILD);
while(::IsWindow(hWndPrev))
{
//判断窗口是否有我们预先设置的标记,如有,则是我们寻找的窗口,并将它激活。
HANDLE handle = ::GetProp(hWndPrev,_TEXT("test11"));
if((HANDLE)1 == handle)
{
//如果主窗口已最小化,则恢复其大小。
if (::IsIconic(hWndPrev))
::ShowWindow(hWndPrev,SW_RESTORE);
//将应用程序的主窗口激活。
::SetForegroundWindow(hWndPrev);
return FALSE; //退出实例。
}
//继续寻找下一个窗口。
hWndPrev = ::GetWindow(hWndPrev,GW_HWNDNEXT);
}
//关闭进程互斥体
CloseHandle(m_hMutex);
m_hMutex = NULL;
return FALSE;
}
当然 ,你还应该在你程序的OnInitDialog()函数中加上
::SetProp(this->m_hWnd,_TEXT("test11"),(HANDLE)1);并且在对话框销毁的时候RemoveProp()删除属性值。