关于“vc 运行一个进程实例”文章是愚蠢的

来源:互联网 发布:plc网络传输器缺点 编辑:程序博客网 时间:2024/05/16 18:23

近段写个程序,需要一个实例运行。搜索网文,发现很多类似的文章:http://anwj336.blog.163.com/blog/static/89415209201052410129564/

测试发现并不能很好工作,如下句:

ExitInstance方法中添加下面代码以删除程序ID:

if (m_aAppId) ::GlobalDeleteAtom(m_aAppId);
当第二个实例退出是会把ATOM表中的ID删除。
还有如果程序被非法中止,如从任务管理器中删除,由于ATOM表中ID还在,就再不能运行实例了,除非重启电脑。
有的网友甚至在想,如何保证程序不被任务管理器删除。真是愚蠢。脑子被驴踢了进水。
下面 是我的代码,把它放到对话框的初始化函数OnInitDialog最后,如果放在InitInstance中,需要处理很多擦屁股问题,
擦不干净,第二个实例虽退尤存,占着内存不拉屎。

 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,听上去是很玄的东西,不过多此一举。

如果不想激活第一实例的窗口,程序可以更简单,不过那不是我想要的。

原创粉丝点击