![强制应用程序成为单个实例](https://linux22.com/image/1284651/%E5%BC%BA%E5%88%B6%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%88%90%E4%B8%BA%E5%8D%95%E4%B8%AA%E5%AE%9E%E4%BE%8B.png)
有没有办法可以强制 Windows 上的应用程序成为单实例应用程序,即,如果同一应用程序的另一个实例已在运行则不会启动?
理想情况下,我希望能够做到这一点而不需要用存根替换实际应用程序,但如果确实有必要,我不介意使用它。
答案1
通常情况下,你必须在应用程序中直接实现“单例”功能。如果你想“从外部”保护它,你必须使用包装器来检查是否已经有另一个实例在运行。可能还有更多的解决方案,但我曾经用安西斯. 想法是这样的:
- 创建一个“假安装程序”,它本身只是你想要启动的应用程序的一个小包装
- 使该安装程序成为单例。参见此处仅允许一个安装程序实例或者检查您的应用程序是否正在运行
- 从该“包装安装程序”启动您的应用程序。请参阅此处ExecCmd 插件
- “隐藏”普通应用程序图标,让用户看不到,并显示虚假安装程序。由于您可以为其添加美观的图标,因此您应该能够使其看起来像原始程序。
答案2
除非有解决方法,否则你可以申请应用程序兼容性套件启用此功能 - 我对此表示怀疑(它本身并不是破坏兼容性1的那种东西) - 那么 Windows 中就没有设置。
除了启动器应用程序之外,另一种方法是监视新进程(例如,Win32_Process
对象的 WMI 实例创建事件 - 当然按会话过滤)并执行某些操作来阻止第二个实例。
1当然,当应用程序使用不受支持的机制来检测自身的多个实例时,可能需要进行修复,因此检测机制需要垫片。