CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

怎样使程序只运行一个实例,并且当用户打开文件产生程序实例时自动用本程序的第一个实例打开

楼主wfy023640()2005-05-31 01:04:50 在 VC/MFC / 基础类 提问

怎样使程序只运行一个实例,并且当用户打开文件产生程序实例时自动用本程序的第一个实例打开 问题点数:60、回复次数:6Top

1 楼alaisalaix(天上人间)回复于 2005-05-31 01:30:52 得分 10

方法一:  
  在IninInstance()函数加入如下代码:    
  HANDLE   hObject   =   CreateMutex(NULL,FALSE,"SingleInstance");  
  if(GetLastError()   ==   ERROR_ALREADY_EXISTS)  
  {  
  CloseHandle(hObject);  
  AfxMessageBox("程序已经运行!");  
  return   FALSE;  
  }  
  Top

2 楼alaisalaix(天上人间)回复于 2005-05-31 01:34:16 得分 20

方法二,使用编译器来实现,较复杂一点  
  使用#pragma   data_seg编译指令,共享一个全局变量  
   
  总之,要实现一个程序实例,需要采用互斥机制Top

3 楼wormwwww(大虫)回复于 2005-05-31 06:30:06 得分 5

在App文件里加:  
  例如:  
  BOOL   CWatchApp::InitInstance()  
  {  
  .  
  .  
  .  
  HWND   oldHWnd   =   NULL;  
  EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);         //枚举所有运行的窗口  
  if(oldHWnd   !=   NULL)  
  {  
  ::ShowWindow(oldHWnd,3);                     //激活找到的前一个程序  
  ::SetForegroundWindow(oldHWnd);                                 //把它设为前景窗口  
  return   false;                                                                     //退出本次运行  
  }  
  .  
  .  
  .  
  SetProp(theApp.GetMainWnd()->m_hWnd,g_szPropName,g_hValue);//设置唯一属性  
   
  .  
  .  
  .  
  }Top

4 楼wormwwww(大虫)回复于 2005-05-31 06:30:54 得分 0

alaisalaix(流水落花春去也,天上人间)说得很对,就是互斥!Top

5 楼younggle(洋溢)回复于 2005-05-31 09:03:10 得分 25

下面可以满足你的需求:  
   
  #define   APPLICATION_TITLE   "你应用程序的窗口标题"  
   
  static   HANDLE   g_RunningMutex   =   NULL;  
   
  BOOL   CXXXXXApp::InitInstance()  
  {  
        //只运行一个实例  
          g_RunningMutex   =   CreateMutex(NULL,   TRUE,   _T(APPLICATION_TITLE));  
          if(GetLastError()   ==   ERROR_ALREADY_EXISTS)  
          {  
  HWND   hWnd   =   FindWindow(NULL,   APPLICATION_TITLE);  
  if(hWnd   !=   NULL)  
  {  
  ShowWindow(hWnd,SW_MAXIMIZE);  
  SetForegroundWindow(hWnd);  
  BringWindowToTop(hWnd);  
  }  
  else  
  {  
  CString   strMessage("");  
  strMessage.Format("%s   已经在运行!",   APPLICATION_TITLE);  
  ::MessageBox(NULL,   strMessage,   "提示",   MB_OK|MB_ICONEXCLAMATION);  
  }  
   
  if(   NULL   !=   g_RunningMutex   )  
  {  
  CloseHandle(g_RunningMutex);  
  g_RunningMutex   =   NULL;  
  }  
   
                  return   FALSE;  
          }  
   
   
          .........................  
  }  
   
  int   CXXXXXApp::ExitInstance()  
  {  
          //   TODO:   Add   your   specialized   code   here   and/or   call   the   base   class  
          if(g_RunningMutex   !=   NULL)  
          {  
                  CloseHandle(g_RunningMutex);  
                  g_RunningMutex   =   NULL;  
          }  
   
          return   CWinApp::ExitInstance();  
  }Top

6 楼wfy023640()回复于 2005-05-31 13:20:48 得分 0

多谢各位Top

相关问题

  • 如何让程序单实例运行?
  • 只运行一个JAVA程序实例
  • 如何让同一个文件夹下的程序只运行一个实例(不完全是一个应用一个实例的的问题).
  • 怎样让VB程序只运行一个程序实例呢
  • 能否给个在win2k下获得系统中所有正在运行的应用程序的路径名及文件名的实例?
  • 怎样让我的MFC程序只能运行一个实例?
  • 如何得知程序的一个实例正在运行?
  • 在C#中如何让程序只运行一个实例
  • 如何让一个程序只有一个实例在运行?
  • 如何防止程序运行多个实例?

关键词

  • 文件
  • application
  • null
  • 实例
  • runningmutex
  • 程序
  • oldhwnd
  • 运行
  • 打开
  • strmessage

得分解答快速导航

  • 帖主:wfy023640
  • alaisalaix
  • alaisalaix
  • wormwwww
  • younggle

相关链接

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

广告也精彩

反馈

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