WEB开发网
开发学院软件开发VC 程序只运行一个实例,并激活前一个实例 阅读

程序只运行一个实例,并激活前一个实例

 2006-07-20 11:37:54 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 示例代码运行效果图如下:实现程序只运行一次的方法很多,但是原理都是一样的,程序只运行一个实例,并激活前一个实例,就是运行第一次的时候设置一个标记,每次运行的时候检查该标记,如果有就说明已经运行了,具体实现:1、在程序初始化的时候 (InitInstance()) 枚举所有的窗口

本文示例源代码或素材下载

示例代码运行效果图如下:

实现程序只运行一次的方法很多,但是原理都是一样的,就是运行第一次的时候设置一个标记,每次运行的时候检查该标记,如果有就说明已经运行了。

具体实现:

1、在程序初始化的时候 (InitInstance()) 枚举所有的窗口,查找本程序的实例是否存在

2、在主窗口初始化的时候在本窗口的属性列表中添加一个标记,以便程序查找.

部分关键代码

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

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);

Tags:程序 运行 一个

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接