现在的位置: 首页 > 综合 > 正文

使程序运行一个实例

2013年10月20日 ⁄ 综合 ⁄ 共 1068字 ⁄ 字号 评论关闭

一个程序运行一个实例,觉得这个方法是最好的,比查找窗口的好多了。。。

从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;
}

抱歉!评论已关闭.