C# 从关联的文件类型加载数据

C# Loading Data from an Associated File Type

我创建了自己的文件类型 (.track),并且能够在我的解决方案的发布选项中设置关联。安装我的程序后,双击任何 .track 文件打开我的应用程序。当出现这种情况时,我希望程序加载被双击的文件的内容。

    public static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        if(args.Length == 1)
        {
            MessageBox.Show(args[0]); //For Debugging
            Application.Run(new TrackerForm(args[0]));
        }
        else
        {
            MessageBox.Show(args.Length.ToString()); //Confirms that no arguments are passed.
            Application.Run(new TrackerForm());
        }
    }

我假设双击文件的路径将通过命令行参数传递给应用程序。但是,双击我的关联文件类型的文件根本不会向我的可执行文件传递任何参数。双击关联的可执行文件时究竟发生了什么?我需要做什么才能让我的程序加载在 windows 资源管理器中双击的文件?

当我使用文件路径作为命令行参数进行调试时,我的程序运行完美,因此我认为这不是由于打开文件时出错所致。

当您双击文件时,shell 使用 "Open" 动词启动它。 "Open" 动词按如下方式运行应用程序:

"My Program.exe" "%1"

“%1”是您双击的文件路径。您可以查看此 MDSN 页面了解更多信息。

TJ Moats 提供的解决方案有效。但是,我想记录我的步骤。

  1. 要到达注册表中的正确位置,您需要知道扩展程序的 ProgID。

    在解决方案资源管理器中,您可以通过右键单击项目名称找到它,然后选择“属性”>“发布”>“选项...”>“文件关联”。就我而言,这些是我给出的设置:

    Extension = .track | Description = File Tracker Data File | ProgID = .trackfile | Icon = Tracker.ico
    
  2. 打开 regedit,然后导航至 HKEY_CLASSES_ROOT > [ProgID] > shell > 打开 > 命令。就我而言,密钥位于:

    HKEY_CLASSES_ROOT\.trackfile\shell\open\command
    
  3. 双击“(默认)”编辑密钥数据。您将需要两件事,可执行文件的确切路径和“%1”。就我而言,我制作的 .exe 安装到 App Data 中的这个目录:

    C:\Users\Bill\AppData\Local\Apps.0\W82CG2C9.L4CQ4LH0K1.HXH\file..tion_6762072d39e56a94_0001.0000_f0f46736a74a5052\FileTracker.exe
    
  4. 现在,删除“(Default)”中的值。将其替换为 .exe 的路径。不包括引号。按照 .exe 的路径,使用单个 space,然后是“%1”。您必须在 %1 周围加上引号。

    在我的例子中,新值与下面一行中显示的完全一样:

    C:\Users\Bill\AppData\Local\Apps.0\W82CG2C9.L4CQ4LH0K1.HXH\file..tion_6762072d39e56a94_0001.0000_f0f46736a74a5052\FileTracker.exe "%1"
    

接受新值后,我无需执行任何其他操作。现在,当我双击 .track 文件时 Windows Explorer 将双击文件的路径作为命令行参数传递给我的 FileTracker.exe 可执行文件。

但是,每次发布新版本时我都需要重复此过程,因为新的.exe 将位于AppData 下的不同文件夹中。