.NET:如何使用现有实例打开文件?

时间:2011-06-08 08:13:40

标签: .net file instance mdi

我有一个MDI文件查看器。也就是说,我的程序可以在单个实例中打开多个文件。顺便说一下,我的应用程序不是单个实例应用程序,因此用户可以根据需要打开任意数量的实例。

我想要的行为是

When the user double-clicks a file in Windows Explorer,
if there is an existing instance of my application,
   then open the file with that instance
else
   open the file with a new instance.

我认为这种行为很常见。 Internet Explorer 9就像。所以,我相信一定有很多人已经实现了这一点。是否有任何完善的.NET(C#是首选的)示例代码(如果可能,不使用Win32 API)?

我想这个算法可能类似于以下内容,但我不知道它是最好还是最干净的代码来实现它(不使用Win32 API)。

At the program's start up
    1)If there are arguments in Main(),
         check for existing instances.
    2)If an instance exists,
         send a message to the instance so that it can open the file.
         Then exit.
    3)else
         open the file.

---- -----增补 对于那些用现有答案回答我的问题的人。

我的申请不是单身申请!请。它就像Internet Explorer 9.我在看WCF P2P,因为我必须向我的应用程序的每个运行实例广播一个文件打开消息,然后选择其中一个。但是使用WCF P2P似乎有很多工作要做,因为它似乎是打开和监听TCP端口。什么是最佳做法?

2 个答案:

答案 0 :(得分:1)

编辑:由于您的应用程序不是单身,请检查 Doc Brown 指出的链接(Opening a "known file type" into running instance of custom app - .NET), Joel Martinez在该链接中有相关答案

我会引用 他的 回复以供快速参考:


  

我这样做的方式是这样的:

     
      
  1. 主要方法的第一件事,检查现有的进程列表   应用程序的实例。
  2.   
  3. 如果找到,请使用发送文件名/路径到已运行的实例   你最喜欢的进程间   沟通方法(sending windows messages,远程处理,wcf等)
  4.   
  5. 关闭Windows尝试启动的新进程(因为现有的   实例已经处理了文件打开   操作
  6.   

我猜你已经知道如何做IPC考虑到你已经通过WCF P2P,但如果没有,我也会删除它的链接。虽然答案针对的是单身人士情景,但它也适合您。只需按创建日期时间或适合您方案的任何条件选择最后一个实例。

请注意,您无法通过此方法获取最后一个活动实例,而无需亲自以某种方式跟踪该实例并从新实例中轮询该信息。

参考:System.Diagnostics.Process.GetProcesss

答案 1 :(得分:1)