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

Posted

技术标签:

【中文标题】检测 Windows 应用程序的多次启动【英文标题】:Detecting multiple launches of a Windows application 【发布时间】:2009-09-28 08:39:54 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案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函数定义了一个新的窗口消息,保证在整个系统中是唯一的。消息值可以在发送或发布消息时使用。"

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

我原以为您应该运行诸如服务之类的安全应用程序或在 Windows 安全桌面上运行。 Zan,你说得对,这只是一个例子。您可以将这个想法应用到 MS-Word / OpenOffice。但是他们不会屈服于这种做法 woudl thay ;-) 如果你有一个激进的竞争对手,他们可以使用这样的系统来阻止你的应用程序工作。

以上是关于检测 Windows 应用程序的多次启动的主要内容,如果未能解决你的问题,请参考以下文章

在 C#/Windows 窗体中检测应用程序启动时的 shift 键

检测系统重启并启动应用程序

Java多次启动相同jar程序

如何在 C# .NET 中检测应用程序池重新启动?

弄清楚一个程序如何在 Windows 上启动另一个程序

如何检测 Windows 关闭或注销