简体   繁体   中英

Receiving arguments from Windows Context menu

I have done this before but for the life of me can't remember how to do this...

In my explorer context menu I added a new entry (go to regedit...go to HKEY_CLASSES_ROOT...bla bla bla)... Now when I click on my option I want to pass in the file path, file name, those kind of things to my application...and then use it there?

The default value of the .ext\\shell\\open\\command key should contain the path to your .exe with the "%1" argument. Explorer substitutes that with the full path to the file. Which you can read in your .exe through the Main() method argument or Environment.GetCommandLineArgs().

您应该从上下文菜单中打开一个窗口,然后将数据传递到您的应用程序。

Try this projects links: How to fetch the value on the click of Context Menu Item and pass the same as a parameter to the executable , .NET Shell Extensions - Shell Context Menus

or this one this url: codeproject.com/Articles/3111/C-NET-Command-Line-Arguments-Parser


code exemple:

    // Variables
    private StringDictionary Parameters;

    // Constructor
    public Arguments(string[] Args)
    {
        Parameters = new StringDictionary();
        Regex Spliter = new Regex(@"^-{1,2}|^/|=|:",
            RegexOptions.IgnoreCase|RegexOptions.Compiled);

        Regex Remover = new Regex(@"^['""]?(.*?)['""]?$",
            RegexOptions.IgnoreCase|RegexOptions.Compiled);

        string Parameter = null;
        string[] Parts;

        // Valid parameters forms:
        // {-,/,--}param{ ,=,:}((",')value(",'))
        // Examples: 
        // -param1 value1 --param2 /param3:"Test-:-work" 
        //   /param4=happy -param5 '--=nice=--'
        foreach(string Txt in Args)
        {
            // Look for new parameters (-,/ or --) and a
            // possible enclosed value (=,:)
            Parts = Spliter.Split(Txt,3);

            switch(Parts.Length){
            // Found a value (for the last parameter 
            // found (space separator))
            case 1:
                if(Parameter != null)
                {
                    if(!Parameters.ContainsKey(Parameter)) 
                    {
                        Parts[0] = 
                            Remover.Replace(Parts[0], "$1");

                        Parameters.Add(Parameter, Parts[0]);
                    }
                    Parameter=null;
                }
                // else Error: no parameter waiting for a value (skipped)
                break;

            // Found just a parameter
            case 2:
                // The last parameter is still waiting. 
                // With no value, set it to true.
                if(Parameter!=null)
                {
                    if(!Parameters.ContainsKey(Parameter)) 
                        Parameters.Add(Parameter, "true");
                }
                Parameter=Parts[1];
                break;

            // Parameter with enclosed value
            case 3:
                // The last parameter is still waiting. 
                // With no value, set it to true.
                if(Parameter != null)
                {
                    if(!Parameters.ContainsKey(Parameter)) 
                        Parameters.Add(Parameter, "true");
                }

                Parameter = Parts[1];

                // Remove possible enclosing characters (",')
                if(!Parameters.ContainsKey(Parameter))
                {
                    Parts[2] = Remover.Replace(Parts[2], "$1");
                    Parameters.Add(Parameter, Parts[2]);
                }

                Parameter=null;
                break;
            }
        }
        // In case a parameter is still waiting
        if(Parameter != null)
        {
            if(!Parameters.ContainsKey(Parameter)) 
                Parameters.Add(Parameter, "true");
        }
    }

    // Retrieve a parameter value if it exists 
    // (overriding C# indexer property)
    public string this [string Param]
    {
        get
        {
            return(Parameters[Param]);
        }
    }
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM