Windows 程序防多开¶
在 Windows 上保证一个程序只有一个实例,禁止多开。
用 Mutex 实现¶
这个是比较常用的方法。程序启动时,创建一个命名的 Mutex,如果之前就存在,那么说明多开了,直接退出。
文档:CreateMutexA function (synchapi.h) - Win32 apps | Microsoft Learn
HANDLE hMutex = CreateMutex(NULL, FALSE, TEXT("MyUniqueMutexName"));
// 创建失败
if (hMutex == NULL)
{
return;
}
// https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-createmutexw#return-value
// If the mutex is a named mutex and the object existed before this function call,
// the return value is a handle to the existing object,
// and the GetLastError function returns ERROR_ALREADY_EXISTS.
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
// 释放 Mutex
CloseHandle(hMutex);
return;
}
// 程序的逻辑 ...
// 结束后释放 Mutex
CloseHandle(hMutex);
CreateMutex
返回内核对象的句柄,用完以后要调用 CloseHandle
释放它,减少内核对象的引用计数。
ReleaseMutex
是释放 Mutex 的所有权。这里只判断 Mutex 是否存在,不管所有权,所以不需要用这个函数。
相关文章