1

假设我们有一个文本编辑器应用程序,每个表单使用一个单独的进程运行。该应用程序是单个文档(即没有选项卡或 MDI)。

我们打开了三个表单,其中包含三个文档,A.txt、B.txt 和 C.txt。现在用户双击他桌面上的 B.txt 文件。这将启动相关应用程序的新实例。这个已启动的编辑器实例现在应该退出并聚焦/将已加载此文件的已运行进程置于前面,以便用户不会最终以两个单独的表单加载相同的文档。

我怎样才能最容易地做到这一点?换句话说,我怎样才能找到哪个进程已经在显示一个文档?

文件一旦打开就不会被应用程序打开,所以我不能依靠枚举进程的文件句柄来查找进程。我认为这需要进程之间进行某种形式的通信。理想情况下,我正在寻找 .NET 解决方案,但问题实际上与 Windows 相关/与语言无关。

编辑:我应该提到,出于各种原因,我试图使用单独的进程,而不是在一个进程中运行所有表单。

4

2 回答 2

1

解决此问题的一个好方法是使用互斥锁:使用互斥锁 运行应用程序的单个实例

您可以使用当前应用程序名称+文件名(或其他内容)打开一个互斥锁,然后在它已经打开时切换到该进程。

第二种解决方案是使用带有管道绑定的 WCF。在服务上调用某种“激活”方法以使应用程序自行激活。此链接提供了一些进行进程间通信的方法。

于 2012-05-07T08:50:33.693 回答
1

我将发布使用的解决方案:当应用程序实例打开文档时,我在文档旁边转储一个 .pid/.lock 文件,其中包含进程的 pid。这样我可以切换到打开文档的进程,或者如果该进程不再存在则清除锁定。

于 2012-06-06T09:37:27.813 回答