在使用新的Windows窗体项目后,我发现当您将文件类型与Windows中的可执行文件关联时,您可以使用args[0]
从{{找到启动应用程序的文件的文件路径1}}
如果您的应用程序已经打开,双击文件时是否可以在您的应用程序上启动事件? (显然static void Main(string[] args)
不会被触发)。
我尝试复制的具有行为的应用程序示例:
在这种情况下,GIMP是否使用多个应用程序接受文件关联“打开”的文件?或者是否可以使用单个应用程序“实例”来完成它。
我遇到了麻烦,因为我的大多数搜索都倾向于引导我作为Windows用户进行文件关联(即“如何将.xls文件与excel关联”文章)。
答案 0 :(得分:4)
有多种选择,但没有一种是免费的。
Main()
可以检测到还有另一个副本已经运行,并通过您确定的某种方式将文件名移交给已经运行的副本。鉴于您的约束,选项(1)似乎是最佳选择。
答案 1 :(得分:2)
Raymond当然是对的,但是如果你正在寻找有关选项(1)实施的帮助,你应该看看What is the correct way to create a single instance application?和.NET 4 single application instance以及Switch to other instance of same application
您会注意到检测应用程序非常简单(使用互斥锁)。引入其他应用程序并向其发送文件名可能更具挑战性。
以前关联的问题的答案中提出了三种基本解决方案
使用PostMessage
向第一个实例发送消息。这使用HWND_BROADCAST
,可能会产生意想不到的后果。
使用Microsoft.VisualBasic.ApplicationServices.ApplicationBase当然,对 VisualBasic 的引用会为一些C#开发人员提供帮助。
使用依赖于Windows名称的FindWindow
。
还值得注意的是,如果您希望现有应用程序位于前端,则需要特别小心,因为设置前景只能在不使用的情况下放弃。请参阅Foreground activation permission is like love: You can't steal it, it has to be given to you和AllowSetForegroundWindow以及SetForegroundWindow
答案 2 :(得分:0)
Microsoft为Visual Basic .Net创建了此功能,它也可以被C#使用。
有关C#中的简单示例,请参阅以下帖子:
http://www.openwinforms.com/single_instance_application.html
答案 3 :(得分:0)
这种方法最适合我:Enforcing Single Instance WPF Applications。 特别是,它的传递参数的解决方案也适用于仅通知图标的应用程序。