使程序运行一个实例

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值