代码:
import ctypes
import os
def CheckSoftwareIsRunning():
mutex_name = "MyAppMutex"
mutex = ctypes.windll.kernel32.CreateMutexW(None, False, mutex_name)
if ctypes.windll.kernel32.GetLastError() == 183: # ERROR_ALREADY_EXISTS
ctypes.windll.kernel32.CloseHandle(mutex)
return True
return False
if __name__ == '__main__':
try:
if CheckSoftwareIsRunning():
raise Exception("software is running.")
except Exception as e:
print(e)
解释:
这段代码用于在Windows系统上实现一个互斥体(Mutex)来限制软件只能运行一个实例。
import os
: 导入操作系统相关的模块,用于获取当前工作目录等信息。import ctypes
: 导入 ctypes 模块,用于调用Windows系统的API函数。mutex_name = "MyAppMutex"
: 定义一个互斥体的名称。mutex = ctypes.windll.kernel32.CreateMutexW(None, False, mutex_name)
: 创建一个互斥体对象。CreateMutexW
是Windows API函数,用于创建一个互斥体。None
参数表示使用默认的安全设置,False
参数表示不共享互斥体。函数返回一个互斥体的句柄。ctypes.windll.kernel32.GetLastError()
: 获取最近一次系统调用的错误代码。在这里用于检查是否互斥体已经存在。if ctypes.windll.kernel32.GetLastError() == 183
: 检查错误代码是否为 183,即ERROR_ALREADY_EXISTS
,表示互斥体已经存在,即已经有另一个实例正在运行。ctypes.windll.kernel32.CloseHandle(mutex)
: 关闭互斥体的句柄,释放资源。
通过这段代码,你可以在Windows系统上确保只有一个实例在运行,防止多个实例同时运行造成冲突或资源浪费。