一个程序运行一个实例,觉得这个方法是最好的,比查找窗口的好多了。。。
从Emule的源代码中偷来的哦。。
// 定义
#define MUTEX_GUID _T("mutex.公司名.产品序列号.软件名")
// 注册消息
const static UINT UWM_WHO_ARE_YOU = RegisterWindowMessage(MUTEX_GUID);
// 枚举是所有的窗口,并发送消息给所有的窗口
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
DWORD dwMsgResult;
LRESULT lRes = ::SendMessageTimeout(hWnd,
UWM_WHO_ARE_YOU,
0,
0,
SMTO_BLOCK |SMTO_ABORTIFHUNG,
10000,
&dwMsgResult);
if (lRes == 0)
{
return TRUE;
}
if (dwMsgResult == UWM_WHO_ARE_YOU)
{
HWND * target = (HWND *)lParam;
*target = hWnd;
return FALSE;
}
return TRUE;
}
// 创建互斥
在CWinApp::InitInstance()函数开始中调用
m_hMutexOneInstance = CreateMutex(NULL,TRUE, MUTEX_GUID);
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(m_hMutexOneInstance);
m_hMutexOneInstance = NULL;
HWND hWnd = NULL;
EnumWindows(EnumWindowsProc, (LPARAM)&hWnd);
if (hWnd != NULL)
{
if (::IsIconic(hWnd))
{
::ShowWindow(hWnd, SW_RESTORE);
}
::SetForegroundWindow(hWnd);
}
return FALSE;
}
// 注册消息的映射
在主窗口的消息映射中添加
ON_REGISTERED_MESSAGE(UWM_WHO_ARE_YOU, OnWhoAreYou) //
// 消息处理
LRESULT CMainWnd::OnWhoAreYou(WPARAM wParam, LPARAM lParam)
{
return UWM_WHO_ARE_YOU;
}