You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#应用如何检测文件通过“打开方式”启动的事件并执行指定代码?

实现通过“打开方式”启动C#应用时处理目标文件

当然可以实现!这其实是C#桌面应用的基础场景——当你通过右键「打开方式」选择你的应用时,Windows会把目标文件的完整路径作为命令行参数传递给你的程序,你只需要读取这个参数,就能触发对应的写入逻辑了。

一、读取命令行参数(核心步骤)

不管你做的是控制台应用、WinForms还是WPF程序,都能轻松获取到这个参数:

1. 控制台应用

直接在Main方法的args数组里拿参数就行——第一个元素(args[0])就是用户选中的文件路径:

using System.IO;

namespace OpenWithDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 检查是否有传入文件参数
            if (args.Length > 0)
            {
                string openWithFile = args[0];
                // 执行你需要的写入操作(这里用WriteAllLines示例,和WriteLines功能一致)
                File.WriteAllLines("target_log.txt", new[] { $"打开的文件:{openWithFile}" });
            }
        }
    }
}

2. WinForms/WPF应用

这类UI应用的Main方法默认没有args参数,你可以用Environment.GetCommandLineArgs()来获取:

using System;
using System.IO;
using System.Windows.Forms;

namespace WinFormsOpenWithDemo
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // 获取命令行参数,第一个元素是程序自身的路径
            string[] args = Environment.GetCommandLineArgs();
            if (args.Length > 1)
            {
                string openWithFile = args[1];
                File.WriteAllLines("target_log.txt", new[] { $"打开的文件:{openWithFile}" });
            }

            Application.Run(new Form1());
        }
    }
}

二、让系统识别你的应用(注册“打开方式”)

写完代码后,你需要让Windows知道你的应用可以打开特定类型的文件:

  • 手动注册(简单测试用):右键目标文件 → 「打开方式」→ 「选择其他应用」→ 找到你的exe文件 → 勾选「始终使用此应用打开.xxx文件」。
  • 代码注册(批量部署用):如果需要自动关联文件类型,可以通过操作注册表实现(需要管理员权限),示例代码如下:
using Microsoft.Win32;
using System.Windows.Forms;

// 示例:把.txt文件关联到你的应用
private void RegisterFileAssociation()
{
    // 获取程序的完整路径
    string exePath = Application.ExecutablePath;
    // 注册文件类型关联
    using (var extKey = Registry.ClassesRoot.CreateSubKey(".txt"))
    {
        extKey.SetValue("", "MyApp.TextFile");
    }
    using (var progIdKey = Registry.ClassesRoot.CreateSubKey("MyApp.TextFile\\shell\\open\\command"))
    {
        // %1代表被打开的文件路径
        progIdKey.SetValue("", $"\"{exePath}\" \"%1\"");
    }
}

⚠️ 注意:修改注册表需要管理员权限,操作前最好备份注册表,避免出错。

三、一些细节提醒

  • 处理多个文件:如果用户选中多个文件右键打开,args数组里会包含所有文件的路径,你可以循环遍历处理。
  • 带空格的路径:Windows会自动给带空格的文件路径加上引号,C#会正确解析,不需要额外处理。
  • 写入权限:执行File.WriteLines时,要确保目标路径有写入权限(比如不要写到C:\Windows这类系统目录),建议写到用户的文档目录或者应用数据目录。

这样设置后,每次用户通过「打开方式」用你的应用打开文件时,程序都会自动触发写入逻辑啦!

内容的提问来源于stack exchange,提问作者MeferGota

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:37:28