检测Windows应用程序的多次启动

时间:2009-09-28 08:39:55

标签: c++ windows

在Windows(C ++)应用程序中处理第二,第三等应用程序的批准方式是什么?在这种情况下,我需要运行(第一个)实例来执行一些特殊操作(弹出一个对话框),但是要终止辅助实例。

在Mac上,AppleEvents会在此方案中向您发送“重新打开”消息。 Windows上的Mozilla使用DDE检查现有实例并通过命令行。感觉就像一个非常讨厌的解决方案,都是一样的。

4 个答案:

答案 0 :(得分:6)

windows方式是打开一个命名的互斥锁,如果你能获得它,就意味着你是第一个实例,如果不是,那就是另一个实例。此时你可以注册一个Windows消息(该函数实际上就是RegisterWindowsMessage),它给你一个WM_ msg,你可以发送到所有窗口,只有你的应用程序知道要捕获它,这允许你告诉你的初始副本打开一个对话框框或w / e。

答案 1 :(得分:2)

How to limit 32-bit applications to one instance in Visual C++

“本文中使用的方法是MSDN中WinMain主题下描述的方法。它使用 CreateMutex 函数创建一个可以跨进程检查的命名互斥锁。为每个将用作单个实例的应用程序复制相同的代码,您必须具有的代码位于可以在每个应用程序中重用的C ++包装器类中。“

SendMessage Function

“将指定的消息发送到一个或多个窗口.SendMessage函数调用指定窗口的窗口过程,并且在窗口过程处理完消息之前不会返回。”

“需要使用HWND_BROADCAST进行通信的应用程序应使用RegisterWindowMessage函数来获取用于应用程序间通信的唯一消息。”

RegisterWindowMessage “RegisterWindowMessage函数定义了一个新的窗口消息,保证在整个系统中是唯一的。消息值可以在发送或发布消息时使用。”

答案 2 :(得分:1)

在Windows上,没有真正的解决方案,至少没有开箱即用。

您可以使用互斥锁来执行此类操作,基本上应用程序在启动时检查互斥锁,如果它不存在则创建它。

答案 3 :(得分:0)

CreateMutex方法存在一个您可能需要考虑的问题 - 命名的互斥锁可能是由第三方创建的。现在,大多数情况下,这不会是一个问题,没有其他人阻止您的申请。但是,如果您正在制作一个重要的程序,则可能是一个问题。考虑一下,如果您的程序是病毒扫描程序,病毒可以通过创建互斥锁来禁用它。

通常,CreateMutex应该完成这项工作,但您应该了解此方法的限制。