您的位置:首页 > 编程语言 > C语言/C++

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

2015-10-20 11:46 288 查看
为了方便我们新建一个名为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此时如果运行超过一个程序时会提示程序已运行的提示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ Windows 单进程