【问题标题】:C# Passing Arguments Through Context MenuC# 通过上下文菜单传递参数
【发布时间】:2023-08-27 04:49:01
【问题描述】:

所以我制作了一个程序,在 pc 上创建一个注册表项,它添加了一个选项来将您的文件推送到您的设备。 (程序本身会将文件推送到您的 Android sd 卡。)

一旦我弄清楚了这个问题,一切都会运行良好,或者至少应该运行良好。当我右键单击一个项目并选择我的命令(即用我的程序打开)时,我的程序只是打开了,但没有传递任何参数。

一个月前,我设计了一个程序,当用户双击(只是双击,而不是右键单击上下文菜单)文件时打开,它打开了特定的程序,从那里我能够获取参数.

为什么我不能从上下文菜单中?

谢谢,很抱歉发了这么长的帖子。

这是我的部分代码:

private void Form1_Load(object sender, EventArgs e)
    {
        string c = textBox3.Text;

          string[] args = System.Environment.GetCommandLineArgs();

          try
          {

              string location = args[1];
              MessageBox.Show(location);
              //For testing purposes only

              Properties.Settings.Default.thinglocation = location;
              Properties.Settings.Default.Save();
              Process();
          }

          catch
          {

          }

这是注册表代码。顺便说一句,字符串 c 是“C:\File push.exe”我程序的位置。

 string MenuName = "*\\shell\\NewMenuOption";
                string Command = "*\\shell\\NewMenuOption\\command";

                RegistryKey regmenu = null;
                RegistryKey regcmd = null;
                try
                {
                    regmenu = Registry.ClassesRoot.CreateSubKey(MenuName);
                    if (regmenu != null)
                        regmenu.SetValue("", "Push to Android");
                    regcmd = Registry.ClassesRoot.CreateSubKey(Command);
                    if (regcmd != null)
                        regcmd.SetValue("", c +"%1");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.ToString());
                }
                finally
                {
                    if (regmenu != null)
                        regmenu.Close();
                    if (regcmd != null)
                        regcmd.Close();

【问题讨论】:

  • 您需要向我们展示您创建的注册表项,并且可能需要将 %1 添加到该注册表项
  • 您是否检查了“EventArgs e”或“string[] args”中的值?我建议检查项目的属性(如文件名)是否是集合的一部分。

标签: c# menu arguments


【解决方案1】:

我假设您已经创建了一个注册表项,该注册表项创建了您用来启动程序的上下文菜单项。可能是您需要在要启动的 exe 名称后添加“%1”。在上下文菜单中,注册表项 %1 代表选定的文件,因此添加它应该会启动您的程序并提供选定文件的名称作为单个参数。

之前双击工作的原因是windows会为双击的文件启动默认程序,以双击的文件作为参数。

【讨论】:

  • 嘿,感谢我尝试过的建议,但我现在收到了打开的程序列表。我想我在注册表中输入了一些错误。
  • 没关系,只是再试了几次,效果很好!!!!非常感谢!
  • 我认为您的问题是您在上面的示例代码中的 %1 之前没有空格?如果不是,您能否发布最终的固定代码,显示您的“一些调整”将在未来帮助他人。
【解决方案2】:

您是否尝试查看发件人或 EventArgs 参数?我想他们可能在那里。这只是一个猜测。如果只是双击,那为什么会有任何争论?也许我只是误解了这一点。无论如何,也许这有帮助。如果不是,也许你可以澄清一下这些论点应该来自哪里。

埃里克

【讨论】:

  • Erik,我认为你投了反对票,因为你没有真正回答这个问题,但不要灰心,它发生了。我认为双击窗口将启动默认程序并提供双击文件的名称作为可执行文件的参数
  • 谢谢山姆...这一定是有充分理由的。我认为在大多数情况下,正在运行(并双击)的文件将是可执行文件。否则,这将是一条捷径,它本身就有正确的论据。无论如何,这家伙似乎得到了答案。我需要尝试回馈,因为我从像你这样的人那里得到了足够的帮助。再次感谢。
  • 想想如果你双击一个.xls文件,它会默认用Excel打开。 Windows 只是调用 excel.exe,将文件名和路径作为命令行参数传递。