您的位置:首页 > 其它

如何激活已经存在的一个进程

2011-10-22 14:36 323 查看
最近在研究如何只运行程序的一个实例,当第二次运行时,激活已经存在的进程的方法,其中一个方法就是通过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()删除属性值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: