如何激活已经存在的一个进程
2011-10-22 14:36
323 查看
最近在研究如何只运行程序的一个实例,当第二次运行时,激活已经存在的进程的方法,其中一个方法就是通过GetWindow()函数来枚举窗口,然后依次调用GetPorp()函数来获取属性值,值为进程设置的值时,表示该窗口就是我们要查找的窗口,在BOOL CCTestApp::InitInstance()中加入以下代码
当然 ,你还应该在你程序的OnInitDialog()函数中加上
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()删除属性值。
相关文章推荐
- MFC如何判断一个进程已经存在
- Doc的窗口就创建一个,如果已经存在就激活那个窗口,不存在就建立Doc(转自CSDN)
- 上篇文章介绍如何在settings中增加一个新模块,那如何隐藏一个已经存在的模块呢?
- delphi中如何查看某个程序在进程中是否已经存在
- 如何使用最简单的方法将一个已经存在的工程中使用 cocaPodfile
- 如何判断数据库中1个表已经存在,这样不会重复创建一个新表(用sql语句)
- c#里面如何激活一个外部程序进程并显示在最前
- 如何件一个已经存在的项目推送到新建的版本库中
- 如何用extjs显示一个已经存在的页面
- Android GridView 中如何实现item合并,类似于桌面的应用图标效果,长按拖动,加入到另外一个已经存在的文件夹中,或者是压在另一个图标上,行成新的
- sqlite3如何判断一个表是否已经存在于数据库中c++
- iOS 如何在一个已经存在多个project的workspace中引入cocoapods管理第三方类库
- 如何给一个已经存在的表添加id(唯一标识符)
- mysql中如何判断 一个数据表是否已经存在
- oracle中如何查看一个方案中已经存在的sequence?
- 如何加入一个已经存在的sf.net项目
- delphi中如何查看某个程序在进程中是否已经存在
- 如何保证IO重定向不会破坏一个已经存在的文件
- eclipse如何打开一个存在的工程。我的工程已经eclipse的workspace下