关于“vc 运行一个进程实例”文章是愚蠢的
2011-02-13 15:49
477 查看
近段写个程序,需要一个实例运行。搜索网文,发现很多类似的文章:http://anwj336.blog.163.com/blog/static/89415209201052410129564/
测试发现并不能很好工作,如下句:
BOOL isInitInstanceExist=false;
HWND hWnd = ::GetWindow(::GetForegroundWindow(), GW_HWNDFIRST);
for (; hWnd; hWnd = ::GetWindow(hWnd, GW_HWNDNEXT))
{
if ((HANDLE)::GetProp(hWnd,UNIQUE_ID) == (HANDLE)51888)
{
if (::IsIconic(hWnd)) ::ShowWindow(hWnd, SW_RESTORE); //还原最小化的窗口
::SetForegroundWindow(hWnd); //激活窗口
isInitInstanceExist=true; //赋值0是为了防止ExitInstance中将找到的ATOM量删除
break;
}
}
if(isInitInstanceExist)
{
::SendMessage(this->m_hWnd, WM_CLOSE, 0, 0);//
}
else
::SetProp(this->m_hWnd,UNIQUE_ID, (HANDLE)51888);
#define UNIQUE_ID _T("AE4E0E00-5E9D-4280-1168-B96DA11507E8")
这句定义在开头,为了防止和别人的程序冲突,尽量不同,还有那个51888,随便写。
本代码简洁有效,居家旅行必备。原文代码多,还使用ATOM,听上去是很玄的东西,不过多此一举。
如果不想激活第一实例的窗口,程序可以更简单,不过那不是我想要的。
测试发现并不能很好工作,如下句:
ExitInstance方法中添加下面代码以删除程序ID: |
if (m_aAppId) ::GlobalDeleteAtom(m_aAppId); 当第二个实例退出是会把ATOM表中的ID删除。 还有如果程序被非法中止,如从任务管理器中删除,由于ATOM表中ID还在,就再不能运行实例了,除非重启电脑。 有的网友甚至在想,如何保证程序不被任务管理器删除。真是愚蠢。脑子被驴踢了进水。 下面 是我的代码,把它放到对话框的初始化函数OnInitDialog最后,如果放在InitInstance中,需要处理很多擦屁股问题, 擦不干净,第二个实例虽退尤存,占着内存不拉屎。 |
HWND hWnd = ::GetWindow(::GetForegroundWindow(), GW_HWNDFIRST);
for (; hWnd; hWnd = ::GetWindow(hWnd, GW_HWNDNEXT))
{
if ((HANDLE)::GetProp(hWnd,UNIQUE_ID) == (HANDLE)51888)
{
if (::IsIconic(hWnd)) ::ShowWindow(hWnd, SW_RESTORE); //还原最小化的窗口
::SetForegroundWindow(hWnd); //激活窗口
isInitInstanceExist=true; //赋值0是为了防止ExitInstance中将找到的ATOM量删除
break;
}
}
if(isInitInstanceExist)
{
::SendMessage(this->m_hWnd, WM_CLOSE, 0, 0);//
}
else
::SetProp(this->m_hWnd,UNIQUE_ID, (HANDLE)51888);
#define UNIQUE_ID _T("AE4E0E00-5E9D-4280-1168-B96DA11507E8")
这句定义在开头,为了防止和别人的程序冲突,尽量不同,还有那个51888,随便写。
本代码简洁有效,居家旅行必备。原文代码多,还使用ATOM,听上去是很玄的东西,不过多此一举。
如果不想激活第一实例的窗口,程序可以更简单,不过那不是我想要的。
相关文章推荐
- vc 防止程序重复运行(即只运行一个实例)并激活已运行进程和枚举进程及窗口
- 如何使应用程序只运行一个实例(VC)
- 如何让程序只运行一个实例(VC)
- Qt运行一个实例进程
- vc++高级班之窗口篇[4]---让程序只运行一个实例
- 如何知道一个进程运行了多少个实例?
- VC 设置应用程序只能运行一个实例
- Qt之运行一个实例进程
- 在VC++实现控制程序只运行唯一一个实例
- C# 创建互斥进程(程序只能运行一个实例)
- VC++ 只运行一个程序实例
- Qt运行一个实例进程
- 进程地址空间的共享(可以实现一个程序只有一个实例运行)
- 进程只运行一个实例
- 【VC】 实现程序只运行一个实例
- 如何在 .net 中只运行一个进程实例?
- 只允许一个进程运行的实例
- C#利用Mutex互斥量实现同时只有一个进程实例在运行
- VC 对话框 只允许运行一个实例 ,如果有就激活到前端
- VC 实现程序只运行一个实例,并激活已运行的程序