MFC中应用程序只允许运行一个实例方法二与三

来源:互联网 发布:软件租赁合同 编辑:程序博客网 时间:2024/04/30 06:35

VC++ 中编程中,只运行一个实例的方法主要有两类:

1 遍历当前的所有窗口,查找相同的实例。为了便于查找,一般要事先设一个查找标志。

2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例。

在发现重复运行时,一般还有一个任务,就是激活已经存在的窗口。

一、 第一类方法的实现

下面是一个具体的例子,下图是示例代码运行的情况。

部分关键代码 

1、在AppInitInstance()中枚举所有窗口,查找本程序实例 

HWND oldHWnd = NULL;

EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);    //枚举所有运行的窗口

if(oldHWnd != NULL)

{

AfxMessageBox("本程序已经在运行了");

::ShowWindow(oldHWnd,SW_SHOWNORMAL);          //激活找到的前一个程序

::SetForegroundWindow(oldHWnd);                //把它设为前景窗口

return false;                                  //退出本次运行

}

2、添加EnumWndProc窗口过程函数://通过自定义的属性名查找同类实例窗口

CString  g_szPropName = "Your Prop Name";   //自己定义一个属性名

HANDLE   g_hValue = (HANDLE)1;         //自己定义一个属性值

 

BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)

{

HANDLE h = GetProp(hwnd,g_szPropName);

if( h == g_hValue)

{

*(HWND*)lParam = hwnd;

return false;

}

return true;

}

3、在主窗口的 OnInitDialog()中添加属性 //设置窗口属性

SetProp(m_hWnd,g_szPropName,g_hValue);

二、 第二类方法

利用互斥对象的例子

//首先在InitInstance() 函数中创建一个同步对象

//如果 GetLastError() 返回ERROR_ALREADY_EXISTS就表明存在一个应用实例了

//返回false取消

  // 创建同步对象

hMutexOneInstantance=CreateMutex(NULL,TRUE,_T("PreventSecondInstance"));

if(GetLastError()==ERROR_ALREADY_EXISTS) bFound=TRUE;

 

if(hMutexOneInstantance) ReleaseMutex(hMutexOneInstantance);

  if (bFound==TRUE)

  { ::AfxMessageBox("You have Run one");

  return false;

  }

这里没有进行激活已有实例的操作。

原创粉丝点击