在Windows(C ++)应用程序中处理第二,第三等应用程序启动的批准方式是什么? 在这种情况下,我需要运行(第一个)实例采取一些特殊的操作(popup一个对话框),但是要终止辅助实例。
在Mac上,AppleEvents在这种情况下向您发送“重新打开”消息。 Windows上的Mozilla使用DDE来检查现有的实例并通过命令行。 这感觉就像一个非常讨厌的解决scheme,都是一样的。
窗口的方式是打开一个有名的互斥锁,如果你能获得它,这意味着你是第一个例子,如果没有,还有另外一个。 在这一点上,你可以注册一个Windows消息(该函数是字面上的RegisterWindowsMessage),它给你一个WM_味精,你可以发送到所有的窗口,只有你的应用程序会知道赶上它,它允许你告诉你的初始副本打开一个对话框框或w / e。
如何将32位应用程序限制为Visual C ++中的一个实例
“本文中使用的方法是在WinMain主题下的MSDN中描述的方法,它使用CreateMutex函数创建一个可以跨进程检查的命名互斥体,而不是为每个应用程序复制相同的代码将作为单个实例使用,您必须拥有的代码位于可在每个应用程序中重用的C ++包装类中。
SendMessage函数
“将指定的消息发送到一个窗口或多个窗口,SendMessage函数调用指定窗口的窗口过程,直到窗口过程处理消息才返回。
“需要使用HWND_BROADCAST进行通信的应用程序应使用RegisterWindowMessage函数获取用于应用程序间通信的唯一消息。”
RegisterWindowMessage “RegisterWindowMessage函数定义了一个新的窗口消息,保证在整个系统中是唯一的,消息值可以在发送或发送消息时使用。
在Windows上,至少不是开箱即用的解决方案。
你可以使用互斥来做这样的事情,基本上应用程序检查互斥体在启动时创建它,如果它不存在。
CreateMutex
方法有一个问题,您可能需要考虑 – 指定的互斥体可能由第三方创建。 现在,大多数情况下,这不是一个问题,没有其他人阻止你的申请的理由。 但是,如果你正在制定一个重要的程序,这可能是一个问题。 考虑一下,如果你的程序是病毒扫描程序,病毒可以通过创建互斥体来禁用它。
通常, CreateMutex
应该做这个工作,但是你应该知道这个方法的局限性。