只运行一个实例的方法
    在VC++ 中编程中,只运行一个实例的方法主要有两类:
1 遍历当前的所有窗口,查相同的实例。为了便于查,一般要事先设一个查标志。
2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例。
    在发现重复运行时,一般还有一个任务,就是激活已经存在的窗口。
一、 第一类方法的实现
    下面是一个具体的例子,下图是示例代码运行的情况。
部分关键代码
enum函数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);
二、 第二类方法
    利用互斥对象的例子
//首先在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;
    }
    这里没有进行激活已有实例的操作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。