CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

[求教]如何使应用程序在同一时刻只有一个实例在运行?

楼主clrscr(明净止水)2003-09-04 07:58:43 在 VC/MFC / 进程/线程/DLL 提问

就像Media   Player一样? 问题点数:50、回复次数:8Top

1 楼zzkcn()回复于 2003-09-04 08:12:22 得分 10

在App类InitInstance()函数的开头增加:  
  CWnd   *pOtherWnd   =   CWnd::FindWindow(NULL,   "A2");//A2是主框架的标题  
  if(pOtherWnd!=NULL)  
  {  
  AfxMessageBox("Program   already   running!");  
  return   FALSE;  
  }Top

2 楼abc_rain()回复于 2003-09-04 08:12:36 得分 10

_hMutex=CreateMutex(NULL,FALSE,m_pAppName);   //HANDLE   m_hMutex;  
  if(GetLastError()==ERROR_ALREADY_EXISTS)  
  {  
  HWND   hWnd=::FindWindow(NULL,m_pAppName);  
  if(hWnd)  
  {  
  if(::IsIconic(hWnd))  
  ::ShowWindow(hWnd,SW_RESTORE);  
  ::SetForegroundWindow(hWnd);  
  ::SetForegroundWindow(::GetLastActivePopup(hWnd));  
  }  
  else  
  MessageBox(NULL,"您的程序已经运行了","提示信息",MB_ICONINFORMATION);  
  return   FALSE;  
  }  
   
   
   
   
   
                    //在   InitInstance   中,创建信号量:  
  HANDLE   hSem   =   CreateSemaphore(NULL,1,1,m_pszAppName);  
  //信号量已存在?  
  if(GetLastError()   ==   ERROR_ALREADY_EXISTS)  
  {  
  //关闭信号量句柄  
  CloseHandle(hSem);  
  //寻找先前实例的主窗口  
  HWND   hWndPrevious   =   ::GetWindow(::GetDesktopWindow(),GW_CHILD);  
  while(::IsWindow(hWndPrevious))  
  {  
  //检查窗口是否有预设的标记?  
  //有,则是我们寻找的主窗口  
  if(::GetProp(hWndPrevious,m_pszAppName))  
  {  
  //主窗口已经最小化,则恢复其大小  
  if(::IsIconic(hWndPrevious))  
  ::ShowWindow(hWndPrevious,SW_RESTORE);  
  //将主窗口激活  
  ::SetForegroundWindow(hWndPrevious);  
  //将主窗口对话框激活  
  ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));  
  //退出本实例  
  reture   FALSE;  
  }  
  else  
  //继续寻找下一个窗口  
  hWndPrevious   =   ::GetWindow(hWndPrevious,GW_HWNDNEXT);  
   
  }  
  //前一实例已存在,但找不到其主窗口  
  //可能出错了  
  //退出本实例  
  return   FALSE;  
  }  
   
   
   
   
  Top

3 楼cadinfo(无语清风)回复于 2003-09-04 08:12:41 得分 10

1.使用Mutex互斥变量  
  2.使用Prop参加API函数SetProp就懂了Top

4 楼rivershan(阿门)回复于 2003-09-04 10:35:30 得分 10

用Mutex就ok了~  
  一个程序只能拥用一个Mutex~Top

5 楼clrscr(明净止水)回复于 2003-09-04 17:56:33 得分 0

那么我如何得到已经在运行实例中的数据呢?  
  比如,已经运行了一个Pro.exe,其中有一个int,我运行第二个Pro.exe时,希望第二个Pro.exe在检测到已经有一个实例在运行以后,把那个实例中的int加一,然后第二个实例结束。  
  再不用外部文件的前提下,能不能作到。  
  谢谢。Top

6 楼ifengfeng(fengfeng)回复于 2003-09-05 14:31:02 得分 0

InitInstance()里:  
   
  HANDLE   m_hMutex   =   CreateMutex(NULL,TRUE,   m_pszAppName);    
  if(GetLastError()   ==   ERROR_ALREADY_EXISTS)   {   return   FALSE;   }Top

7 楼ifengfeng(fengfeng)回复于 2003-09-05 14:31:26 得分 10

InitInstance()里:  
   
  HANDLE   m_hMutex   =   CreateMutex(NULL,TRUE,   m_pszAppName);    
  if(GetLastError()   ==   ERROR_ALREADY_EXISTS)   {   return   FALSE;   }Top

8 楼DarkShow(我是一个神话)回复于 2003-09-05 14:36:11 得分 0

其实可以做个共享dll,里面放一个变量,启动一次就+1,关闭就-1  
   
  你就可以限制你开几个实例了。  
   
  我这个方法是偏门,楼上几位大大得才是正道哟。Top

9 楼mainmaster(云中漫步)回复于 2003-09-05 14:59:31 得分 0

不明白你的第2个问题,你是要实现记录冲突的启动次数还是?Top

相关问题

  • 如何保证某一时刻只能运行应用程序的一个实例
  • 关于如何禁止应用程序的多个实例运行的问题?
  • 如何利用Mutex实现应用程序的单实例运行
  • 如何禁止应用程序启动多个实例?即同时运行多个相同的程序?
  • 如何在C#的WINDOWS应用程序中禁止运行一个程序的多个实例?
  • 让应用程序只运行一次
  • 关于“应用程序正在运行!”
  • 怎么运行java的应用程序
  • C#的应用程序的运行
  • 无法运行asp.net web应用程序。

关键词

  • 信号
  • null
  • hwndprevious
  • 实例
  • 运行
  • pszappname
  • setforegroundwindow
  • 主窗口
  • hmutex
  • initinstance

得分解答快速导航

  • 帖主:clrscr
  • zzkcn
  • abc_rain
  • cadinfo
  • rivershan
  • ifengfeng

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo