【问题标题】:Getting file path while opening winform app from context menu.从上下文菜单打开 winform 应用程序时获取文件路径。
【发布时间】:2013-03-05 18:03:46
【问题描述】:

使用我的 winform 应用程序从右键菜单打开文件时,我似乎无法获得正确的文件路径。我希望能够右键单击一个文本文件,运行我的程序(regedit.exe 中的 c:\MyApp %1)并在程序打开之前让文件路径出现在消息框中。现在我似乎得到的只是我实际程序的文件路径。这就是我到目前为止所拥有的。

public partial class Form1 : Form
{
    public Form1()
    {   
       string[] args = Environment.GetCommandLineArgs(); 
       foreach (string arg in args)
       {
          MessageBox.Show(arg);
       }
       InitializeComponent();
    }

任何帮助将不胜感激。我知道这可能是一个简单的解决方法,但我对此很陌生,可能会遗漏一些明显的东西。

谢谢。

【问题讨论】:

  • 您是否只有 1 个带有程序名称的 msgbox?你能检查它是否不是你的注册表项错误吗?例如,使用控制台中的任何参数运行您的应用程序:app.exe test?
  • 是的,程序路径中出现了一个 msgbox。我把它放在 HKEY_CLASSES_ROOT -> txtfile -> shell -> "MyCommandName" -> command -> c:\MyApp %1 下。似乎工作正常。
  • 您应该在命令中有 1 个默认值,如下所示:“C:\MyApp.exe”“%1”。不要忽略“的。你的程序应该一个接一个地打印2个消息框。程序的名称,当你确定时 - 文件的名称。
  • 添加了引号,但我仍然只得到一个带有我的程序路径的消息框。
  • 我已经在我的机器上检查过了,它工作正常。我唯一想到的是检查 GetCommandLineArgs() 的长度 - 第一个 arg 是 exe 文件的路径是正常的。但是,如果您使用参数运行它,则应该将其作为数组中的第二个元素。

标签: c#


【解决方案1】:

不确定此信息是否有帮助,因为听起来您已经检查了所有这些,但我刚刚运行了这个快速测试并且它有效:
首先,注册表设置应如下所示。如果 %1 周围没有引号,并且它是一个长文件名,例如“New Text Document.txt”,则每个单词都将成为一个单独的参数,因此请务必在“%1”周围加上引号。

假设注册表设置正确,您现在应该在右键单击文本文件时看到新命令:


当您的程序运行时,数组中的第一项,即 args[0],将是 EXE 的路径。第二项,即 args[1],应该是文件名。

如果您添加了该行
MessageBox.Show(args[1])
当您通过右键单击运行时,您应该会看到完整的文件名。如果您收到错误消息说“索引超出了数组的范围”,那么它肯定没有得到参数。

测试程序是否正常运行的一种方法是打开 DOS 提示符并像这样键入程序的路径,然后按 Enter:

c:\MyApp.exe "这行应该出现"

这会绕过注册表并直接测试程序。如果这有效,那么您就知道问题不在于程序本身,而在于注册表设置。如果这不起作用,那么 C# 代码仍然存在一些问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2021-09-22
    • 2015-03-16
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多