C#CF:如何使用我的程序打开特定的文件扩展名

时间:2010-03-12 22:23:28

标签: c# compact-framework

我正在开发.Net Compact Framework中的移动应用程序。 我设法编辑注册表HKEY_CLASSES_ROOT,以便点击具有.xyz扩展名的文件将打开我的应用程序。基本上,我需要在点击它时对该文件进行一些操作。

但是,我意识到如果我第一次这样做,它会在static void Main到达program.cs。但是当程序运行时我再次单击带有.xyz扩展名的文件时,它不会加载程序static void Main。我尝试在当前运行的表单中设置断点,但仍然没有。

那么它去哪儿了?如何检测文件.xyz被点击并执行某些操作?

4 个答案:

答案 0 :(得分:2)

你遇到的一个大问题是,一旦应用程序运行,Main将永远不会被再次调用,事实上它不应该被调用。

在Windows Mobile下,遗憾的是,CF本身会尝试保留应用程序单例,因此当您尝试第二次使用app时,CLR本身会拦截它,而是将现有实例放在首位。其中一个不幸的副作用是你没有机会处理命令行参数。

要实现这一点,您必须做一些事情:

  1. Subvert the CF's attempt to make your app a sinlgeton因此您可以运行多个实例。
  2. 在应用中按住互斥锁以了解您是否已在运行。
  3. 早期生成一个线程以侦听后续实例中的传入参数。当参数进入时,让自己脱颖而出并适当地处理参数。
  4. 启动时,如果已经使用了互斥锁(即应用程序已在运行),请使用IPC(点对点队列是一种好方法)发送现有应用程序的侦听器线程(请参阅#3)您的参数然后就退出。

答案 1 :(得分:1)

您说每次点击文件时都需要对文件执行某些操作。我假设这是与GUI相关的东西,就像你想要在双击时显示文件的属性一样。

假设您的程序有一个主要表单,您可以将其MinimizeBox属性设置为false,并将Deactivate事件设置为this.Close();。这样,当您单击正确类型的文件时,您的应用程序将启动并读取命令行参数并显示文件详细信息。如果用户然后使用右上方的“确定”按钮关闭您的应用程序,它将关闭以实现真实状态,以便下次打开它时将打开一个新实例并正确读取命令行参数。或者,如果用户只是导航到WinMo中的其他程序,则应用程序的Deactivate事件将触发,关闭应用程序。无论哪种方式,应用程序始终处于打开状态且位于顶部或完全关闭,因此单击文件资源管理器中的文件将始终打开新实例。

答案 2 :(得分:0)

你在Main中有字符串args吗?

static void Main(string[] args)

答案 3 :(得分:0)

您的问题是,您正在寻找再次调用static void Main,这是Static Constructor。静态构造函数只调用一次。它们在类(在这种情况下是你的程序)被初始化之前调用,然后再也不会被调用。他们不是为你的程序的每个新实例调用..