在线查询博客在线输入法火车查询IP查询手机归属地查询新华字典日历查询

如何让vc只运行一个实例,禁止运行程序的多个实例?

Date: 2008-11-19 11:51:39
Category: MFC | Source: input8.com

Tags: MFC vc 实例 Mutex

在MFC中,让vc程序在同一时间内,只允许运行一个实例,禁止运行程序的多个实例。

下面的步骤描述如何让VC程序中在同一时间内,只运行一个实例。当第二次运行时,向最先运行的程序发送消息,使其窗口在最小化或其它状态恢复到正常显示。

下面假设你的工程名为:XXX

在stdafx.h 文件最后添加

extern UINT WM_WKSTLOCK;

打开XXX.cpp,

在CXXXApp theApp;后面添加
UINT WM_WKSTLOCK = RegisterWindowMessage(_T("Input8OnlyOne"));

在BOOL CXXXApp::InitInstance() 中找到

m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();

在这个前面添加

HANDLE Mutex = OpenMutex(MUTEX_ALL_ACCESS, false, "Input8OneInstanceAllowed"); 
    if (Mutex == NULL) 
    { 
        Mutex = CreateMutex(NULL, true, "Input8OneInstanceAllowed"); 
    } 
    else 
    { 
        SendMessage(HWND_BROADCAST, WM_WKSTLOCK, 0, 0); 
        return FALSE;
    }

在最后的 return FALSE; 前面添加

ReleaseMutex(Mutex);

如果不需要在点第二次时把前面已经运行的程序恢复(如果已经最小化的),那么到这里就可以了。

否则继续:

在 XXXDlg.h 的 DECLARE_MESSAGE_MAP() 前面加上一行
afx_msg LRESULT OnWkstLocked(WPARAM wParam, LPARAM lParam); 

在 XXXDlg.cpp 的 BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)下面添加一行
ON_REGISTERED_MESSAGE(WM_WKSTLOCK, OnWkstLocked)

然后添加
LRESULT CXXXDlg::OnWkstLocked(WPARAM wParam, LPARAM lParam)
{
    ShowWindow(SW_RESTORE);
    return 0;
}  

完成。运行一下看看效果:运行程序,然后最小化,再一次运行程序,前面最小化的是不是恢复了:)
Comments(2)
Username*
Email
Homepage
Content*