关于 c:检测 Windows 应用程序的多次启动

Detecting multiple launches of a Windows application

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

在 Mac 上,AppleEvents 在这种情况下会向您发送"重新打开"消息。 Windows 上的 Mozilla 使用 DDE 检查现有实例并传递命令行。感觉就像一个非常讨厌的解决方案,都是一样的。


windows的方式是打开一个命名的互斥体,如果你能得到它,说明你是第一个实例,如果没有,还有另一个。此时,您可以注册一个 Windows 消息(该函数实际上是 RegisterWindowsMessage),它为您提供一个 WM_ msg,您可以发送到所有窗口,并且只有您的应用程序知道捕获它,这允许您告诉您的初始副本打开一个对话框盒子或 w/e.


如何在 Visual C 中将 32 位应用程序限制为一个实例

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

发送消息函数

"将指定的消息发送到一个或多个窗口。SendMessage 函数调用指定窗口的窗口过程,直到窗口过程处理完消息才返回。"

"需要使用HWND_BROADCAST通信的应用程序应该使用RegisterWindowMessage函数来获取一个唯一的消息用于应用程序间通信。"

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


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

您可以使用互斥锁来做这些事情,基本上应用程序在启动时检查互斥锁,如果它不存在则创建它。


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

通常,CreateMutex 应该可以完成这项工作,但您应该注意此方法的局限性。