gpt4 book ai didi

c++ - 防止我的应用程序的多个实例

转载 作者:IT老高 更新时间:2023-10-28 23:09:44 24 4
gpt4 key购买 nike

附加信息

我又在写上述问题(防止我的应用程序的多个实例)

如果我从程序菜单/桌面快捷方式启动两个实例,则该代码有效。但在我的环境中,

一个实例正在从窗口服务运行。

另一个来自具有相同参数的桌面快捷方式。

对如何编写代码有帮助吗?

最佳答案

最常用的方法是使用互斥体,类似如下:

int WINAPI WinMain(...)
{
const char szUniqueNamedMutex[] = "com_mycompany_apps_appname";
HANDLE hHandle = CreateMutex( NULL, TRUE, szUniqueNamedMutex );
if( ERROR_ALREADY_EXISTS == GetLastError() )
{
// Program already running somewhere
return(1); // Exit program
}

// Program runs...

// Upon app closing:
ReleaseMutex( hHandle ); // Explicitly release mutex
CloseHandle( hHandle ); // close handle before terminating
return( 1 );
}

您必须确保正确关闭 - 未删除互斥锁的程序崩溃可能会阻止程序再次运行,但理论上操作系统会在进程结束后清除任何悬空的互斥锁。

另一种常用的方法是在窗口标题中搜索程序标题:

HWND hWnd=::FindWindow(LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);

如果它为空,则没有找到窗口,因此程序没有运行。您可以使用它在关闭这个新实例之前将焦点转移到正在运行的应用程序上,这样用户就不会想知道为什么应用程序没有打开。

if(hWnd != NULL)
{
ShowWindow(hWnd,SW_NORMAL);
// exit this instance
return(1);
}

关于c++ - 防止我的应用程序的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8799646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com