使程序运行一个实例
2008-12-26 09:24
549 查看
一个程序运行一个实例,觉得这个方法是最好的,比查找窗口的好多了。。。
从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;
}
从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;
}
相关文章推荐
- Delphi----怎样保证程序只运行一个实例
- delphi程序只允许运行一个实例的简单方法:
- 【转】delphi程序只允许运行一个实例的三种方法:
- qt编写一个只能运行单个实例的程序,不用Windows API
- 使程序只能运行一个实例
- 让程序只运行一个实例的四种方法(转)
- 【转】C# WinForm 程序单实例运行,再次运行时激活前一个实例
- VC程序只运行一个实例,并在打开多个时激活原窗口
- C#程序只允许运行一个实例的解决方案
- 进程地址空间的共享(可以实现一个程序只有一个实例运行)
- 让程序只运行一个实例
- 解决C# WINFORM程序只允许运行一个实例的几种方法详解
- delphi程序只允许运行一个实例的三种方法:(转)
- VC++实现程序只运行一个实例 (转)
- 运行一个实例的程序(互斥程序)
- 程序只运行一个实例,并激活已运行的程序
- WinForm程序,保证只有一个实例在运行(网上搜集的东西)
- 仅运行一个程序的单个实例
- 让程序只运行一个实例
- [转]实现同时只允许运行一个程序实例