C++Windows下如何让窗口进程只运行一个实例

来源:互联网 发布:王者荣耀 女娲 知乎 编辑:程序博客网 时间:2024/06/06 11:27

为了方便我们新建一个名为MFCTest的MFC对话框项目然后打开找到CMFCTestApp::InitInstance()函数添加单实例检测代码:

BOOL CMFCTestApp::InitInstance(){    //////////////////////////////////////////////////////////////////////////    //单实例检测    try    {        //方式一根据ClassName和窗口标题找窗口句柄( MFC默认CLASSNAME为#32770 )        //非MFC窗口则填写自己设置的ClassName        HWND hWnd = FindWindow( TEXT( "#32770" ), TEXT( "MyMFCTest" ) );        //找到句柄说明在运行        if( NULL != hWnd )        {            throw TEXT( "程序已运行!" );        }        //一般情况下使用方式一即可为了安全防止在方式一失效的情况下        //还有其他的方式来检测所以提供了方式二:        //方式二创建一个互斥量,由于互斥量在进程中共享创建同名互斥量        //GetLastError()会返回ERROR_ALREADY_EXISTS        HANDLE hMutex = CreateMutex( NULL, TRUE, TEXT( "MyMFCTest_Mutex" ) );        //出错        if( NULL == hMutex )        {            throw TEXT( "运行时出错!" );        }        //已存在互斥量说明在运行        if( ERROR_ALREADY_EXISTS == GetLastError() )        {            CloseHandle( hMutex );            hMutex = NULL;            throw TEXT( "程序已运行!" );        }    }    //捕获异常然后退出当前窗口    catch( LPCTSTR e )    {        AfxMessageBox( e );        return FALSE;    }    //下面代码未做修改    //////////////////////////////////////////////////////////////////////////    // 如果一个运行在 Windows XP 上的应用程序清单指定要    // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,    //则需要 InitCommonControlsEx()。否则,将无法创建窗口。    INITCOMMONCONTROLSEX InitCtrls;    InitCtrls.dwSize = sizeof(InitCtrls);    // 将它设置为包括所有要在应用程序中使用的    // 公共控件类。    InitCtrls.dwICC = ICC_WIN95_CLASSES;    InitCommonControlsEx(&InitCtrls);    CWinApp::InitInstance();    AfxEnableControlContainer();    // 标准初始化    // 如果未使用这些功能并希望减小    // 最终可执行文件的大小,则应移除下列    // 不需要的特定初始化例程    // 更改用于存储设置的注册表项    // TODO: 应适当修改该字符串,    // 例如修改为公司或组织名    SetRegistryKey(_T("应用程序向导生成的本地应用程序"));    CMFCTestDlg dlg;    m_pMainWnd = &dlg;    INT_PTR nResponse = dlg.DoModal();    if (nResponse == IDOK)    {        // TODO: 在此放置处理何时用        //  “确定”来关闭对话框的代码    }    else if (nResponse == IDCANCEL)    {        // TODO: 在此放置处理何时用        //  “取消”来关闭对话框的代码    }    // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,    //  而不是启动应用程序的消息泵。    return FALSE;}

然后找到MFCTestDlg::OnInitDialog()函数修改窗口标题:

BOOL CMFCTestDlg::OnInitDialog(){CDialog::OnInitDialog();// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码//设置窗口标题SetWindowText( TEXT( "MyMFCTest" ) );return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}

OK此时如果运行超过一个程序时会提示程序已运行的提示

0 0
原创粉丝点击