项目地址:https://gitee.com/wtl_wtl/MFC_WALLPARER
目的:只允许一个实例运行
方法:网上一共提供了三种方法
1.使用互斥变量,其中红色部分是使用FindWindow查找窗口句柄,然后显示窗口,也是第二种方法的实现思路。
HANDLE hMutex = ::CreateMutex(NULL, TRUE, _T("WALLMFC"));
if (hMutex != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CWnd *pWndPrev;
if (pWndPrev = CWnd::FindWindow(L"CWallPaperDlg", NULL))
{
pWndPrev->ShowWindow(SW_RESTORE);
pWndPrev->SetForegroundWindow();
}
CloseHandle(hMutex);
return FALSE;
}
}
}
ReleaseMutex(hMutex);
CloseHandle(hMutex);
2.判断窗口句柄是否存在,FindWindow函数具体解释如下图(来着msdn)
具体的实例参考第一种方法的红色代码部分,下面介绍关于ClassName的设置:
用文本工具打开*.rc文件,找到你的对话框定义的部分,添加CLASS:
3.使用注册表(没有尝试,不保证正确,操作注册表,有可能被杀毒软件当做病毒清理掉)
#define UNIQE_NAME "{1AB792D6-EAF2-3267-9A84-9135681127A4}"
#define GIS_MSG "{D48CA993-4925-41cb-8F59-ABAAAFCEF797}"
const UINT ID_GIS_INSTANCE = ::RegisterWindowMessage(GIS_MSG); //注册消息
// 确保程序只有一个实例在运行
m_hOneInstance = ::CreateMutex(NULL, FALSE, UNIQE_NAME);
if (GetLastError() == ERROR_ALREADY_EXISTS )//如果存在前一个
{
//发送消息,激活实例
DWORD dwRecipients = BSM_APPLICATIONS;
::BroadcastSystemMessage(BSF_NOHANG, &dwRecipients,
ID_GIS_INSTANCE, // registered window message
0, 0); // user defined parameters
return FALSE;
}
ON_REGISTERED_MESSAGE(ID_GIS_INSTANCE, OnGISInstance)
LRESULT CMainFrame::OnGISInstance(WPARAM wParam, LPARAM lParam)
{
theApp.m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
theApp.m_pMainWnd->SetForegroundWindow();
::AfxMessageBox("本程序已经有一个实例在运行了。");
return 0;
}