C# 仅为此程序添加自定义 Windows 上下文菜单

C# Add custom Windows context menu for just this program

我的问题是:如何为特定应用程序而不是全局添加 windows 上下文菜单项?

快速简介: 我们的 CRM 系统使用 Access(呻吟)。我们使用基本的 'copy to local' 进程进行多路访问。我写了一个 C# 'launcher',它处理这个比 .bat 文件好得多(他们单击启动器,启动器下载数据库,启动数据库并退出)。我目前还使用 C# 控制台应用程序来处理开发、自动化操作,例如递增版本号、移动文件等。


我的Question/Goal: 我想将这两个程序合并为一个程序,但我不想通过让用户询问他们是否想要开发来妨碍启动器的主要目的。我也使用此启动器,因为我主要是一名估算员,因此想将两者结合起来。我读到您可以将上下文菜单项作为一个整体添加到 Windows,但我希望能够将启动选项添加到此应用程序的上下文菜单 just 中。即右键单击程序,正常菜单选项,但添加 "Development Mode",这将打开带有参数的程序,我可以使用这些参数来打开开发 window/console。


注意事项

提前致谢

编辑:制作启动器并运行作为点击一次的应用程序。

我真的不知道是否可以为特定程序提供自定义上下文,据我所知上下文与扩展一起使用。话虽如此,我认为有更好的方法来处理您的问题。看看这个

    static void Main(string[] args)
    {
        /* here normal flow of the launcher*/

        if (args[0] == "-dev")
        {
            /*here de developer mode*/
            Console.WriteLine("Developer mode activated");
        }
    }

使用方法很简单,你做一个快捷方式,在它说快捷方式目标的地方你会有这样的东西"C:\Users****\Documents\visual studio 2017\Projects\Test\Test\bin\Debug\Test.exe"你应该把它改成这样"C:\Users****\Documents\visual studio 2017\Projects\Test\Test\bin\Debug\Test.exe" -开发

根据评论中的建议,由于某种原因已经消失了。我将恢复为按键,但改用 shift 或 "R".

如果失败,或者如果它导致问题,它会考虑为所有程序创建一个全局上下文菜单项,并且在我不需要时不会单击它

除此之外,我偶然发现了一些代码来完成这项工作。希望这会在将来帮助某人。我在 WPF 中执行此操作,但我相信您可以调整此代码以在其他地方工作。

1) App.xaml - 添加 JumpList 操作

在 Application.Resources 属性 之后(不在内部)添加以下内容并根据您的喜好进行更改(出于开发考虑,我还没有使用很多属性,请查看 link 了解更多):

<Application.Resources>
...
</Application.Resources>
<JumpList.JumpList>
    <JumpList ShowRecentCategory="False"
              ShowFrequentCategory="False">
        <JumpTask Title="Open Dev Mode" 
                  Description="Use this to enter dev mode (admins only)"
                  Arguments="DevMode:true"/>
    </JumpList>
</JumpList.JumpList>

这将在跳转列表中创建一个 "Task":

2) 创建全局静态 class - 这将允许您存储变量以供以后以其他形式使用。

public static class Global
{
    public static Boolean DevMode = false;
}

3) App.xaml.cs - 添加 OnStartup 处理程序

在应用内 class 为 OnStartup 创建覆盖方法

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        Global.DevMode = Boolean.Parse(e.Args.FirstOrDefault().ToString().Split(':')[1]);
    }
}

4) 使用 Global.DevMode

读取表单中的变量
private void Window_ContentRendered(object sender, EventArgs e)
{
    if (Global.DevMode) RunYourDevScript();
}