为了方便我们新建一个名为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 );
hM