добавить ярлык в мою программу при щелчке правой кнопкой мыши

Я не уверен, какой точный термин я должен назвать. Я хочу добавить ярлык в свою программу на С#, когда я щелкаю правой кнопкой мыши в окнах.

Судя по моим выводам, это как-то связано с настройкой «regedit». У меня есть этот пример, но он был сделан для IE. может ли кто-нибудь указать мне какие-либо ссылки, которые могут решить мои проблемы?

использованная литература:

http://blog.voidnish.com/?p=17 http://www.codeguru.com/cpp/misc/misc/internetexplorer/article.php/c11007/

большое тебе спасибо.

ОБНОВЛЕНО сегодня..

Основываясь на ответе Factor Mystic, я добавляю этот код к оригиналу. У меня есть 2 решения. Во-первых, он был создан в реестре HKEY_ CLASSES_ ROOT, но я не вижу результата, когда щелкаю правой кнопкой мыши файлы документа.

private const string ProgName = "Software\\Classes\\Word.Document\\shell";
private const string MenuName = "Software\\Classes\\Word.Document\\shell\\NewTesting";
public const string Command =Software\\Classes\\Word.Document\\shell\\NewTesting\\command";

    private void Form1_Load(object sender, EventArgs e)
    {
        txtProgram.Text = "Word.Document.8";
        txtName.Text = "Testing";
        txtPath.Text = "C:\\temp\\encriptTest.exe";
        check();
        addItem()
    }
    public void check()
    {
        RegistryKey regmenu = null;
        RegistryKey regcmd = null;
        try
        {
            //this.CheckSecurity();
            regmenu = Registry.ClassesRoot.OpenSubKey(MenuName, false);
        }
        catch (ArgumentException ex)
        {
            // RegistryPermissionAccess.AllAccess can not be used as a parameter for GetPathList.
            MessageBox.Show(this, "An ArgumentException occured as a result of using AllAccess.  "
                + "AllAccess cannot be used as a parameter in GetPathList because it represents more than one "
                + "type of registry variable access : \n" + ex);
        }
        catch (SecurityException ex)
        {
            // RegistryPermissionAccess.AllAccess can not be used as a parameter for GetPathList.
            MessageBox.Show(this, "An ArgumentException occured as a result of using AllAccess.  " + ex);
            this.btnAddMenu.Enabled = false;
            //this.btnRemoveMenu.Enabled = false;
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.ToString());
        }
        finally
        {
            if (regmenu != null)
                regmenu.Close();
            if (regcmd != null)
                regcmd.Close();
        }
    }

    private void CheckSecurity()
    {
        //check registry permissions
        RegistryPermission regPerm;
        regPerm = new RegistryPermission(RegistryPermissionAccess.Write, "HKEY_CLASSES_ROOT\\" + ProgName);
        regPerm.AddPathList(RegistryPermissionAccess.Write, "HKEY_CLASSES_ROOT\\" + MenuName);
        regPerm.AddPathList(RegistryPermissionAccess.Write, "HKEY_CLASSES_ROOT\\" + Command);
        regPerm.Demand();
    }

    private void addItem()
    {
        RegistryKey regmenu = null;
        RegistryKey regcmd = null;
        RegistryKey regprog = null;
        try
        {
            regprog = Registry.ClassesRoot.CreateSubKey(ProgName);
            if (regmenu != null)
                regmenu.SetValue("", this.txtProgram.Text);
            regmenu = Registry.ClassesRoot.CreateSubKey(MenuName);
            if (regmenu != null)
                regmenu.SetValue("", this.txtName.Text);
            regcmd = Registry.ClassesRoot.CreateSubKey(Command);
            if (regcmd != null)
                regcmd.SetValue("", this.txtPath.Text);

        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.ToString());
        }
        finally
        {
            if (regprog != null)
                regprog.Close();
            if (regmenu != null)
                regmenu.Close();
            if (regcmd != null)
                regcmd.Close();
        }       
    }

Во-вторых, создайте в HKEY_ LOCAL_ MACHINE.

private bool Add_Item(string Extension,string MenuName, string MenuDescription, string MenuCommand)
    {
        //receive .doc,OpenTest,Open with Opentest,path: C:\\temp\\encriptTest.exe %1
        bool ret = false;
        RegistryKey rkey = //receive .doc extension (word.Document.8)
          Registry.ClassesRoot.OpenSubKey(Extension); //set HKEY_LOCAL_MACHINE\software\classes\word.Document.8 
        if (rkey != null)
        {
            string extstring = rkey.GetValue("").ToString();
            rkey.Close();
            if (extstring != null)
            {
                if (extstring.Length > 0)
                {
                    rkey = Registry.ClassesRoot.OpenSubKey(extstring, true);
                    if (rkey != null) //with extension file receive OpenTest as shell
                    {
                        string strkey = "shell\\" + MenuName + "\\command"; //..\shell\OpenTest\command
                        RegistryKey subky = rkey.CreateSubKey(strkey);
                        if (subky != null)
                        {
                            subky.SetValue("", MenuCommand); // path: C:\\temp\\encriptTest.exe %1
                            subky.Close();
                            subky = rkey.OpenSubKey("shell\\" + MenuName, true); //..\shell\OpenTest
                            if (subky != null)
                            {
                                subky.SetValue("", MenuDescription); // name displayed: Open with &OpenTest
                                subky.Close();
                            }
                            ret = true;
                        }
                        rkey.Close();
                    }
                }
            }
        }
        return ret;
    }
}

Меня беспокоит, какой основной ключ я должен использовать?


person user147685    schedule 28.09.2009    source источник
comment
Вы говорите, что хотите щелкнуть правой кнопкой мыши исполняемый файл программы в проводнике Windows? Щелкните правой кнопкой мыши типы файлов, связанные с вашей программой?   -  person Eric J.    schedule 28.09.2009
comment
Привет Эрик, Том Фрей прав!! У меня есть программа на С#, и я хочу добавить свою программу в один из списков, когда я щелкаю правой кнопкой мыши в окнах. Извините за недопонимание!!   -  person user147685    schedule 28.09.2009


Ответы (3)


Я полагаю, вы хотите добавить элементы в контекстное меню проводника. Вот хорошая статья о CodeProject, в которой показано, как это сделать: http://www.codeproject.com/KB/cs/appendmenu.aspx (в основном это просто добавление соответствующих ключей в реестр Windows)

person TJF    schedule 28.09.2009

Вы захотите определить тип файла (ProgID) файлов .doc. Вы можете найти это в HKEY_CURRENT_USER\Software\Classes\.doc (это значение по умолчанию).

Затем добавьте ключ HKEY_CURRENT_USER\Software\Classes\<ProgID>\shell\NewMenuOption\command, где значением по умолчанию является путь к вашей программе.

Все это можно сделать с помощью Registry.SetValue и GetValue.

Перейдите на эту страницу msdn, чтобы начать работу.

Изменить: дополнительная информация, разница между ключами улья:

HKEY_LOCAL_MACHINE\Software\Classes и HKEY_CURRENT_USER\Software\Classes похожи, но HKLM для системных настроек по умолчанию/всех пользовательских настроек, а HKCU для пользовательских настроек. Настройки для каждого пользователя не требуют повышенных привилегий, поэтому вы можете без проблем писать ключи контекстного меню как обычный пользователь.

HKEY_CLASSES_ROOT — это представление, объединяющее HKEY_LOCAL_MACHINE\Software\Classes и HKEY_CURRENT_USER\Software\Classes, с записью, направленной на HKLM. Это быстрый способ записать системные значения по умолчанию, и многие руководства показывают это, потому что это немного проще, но если вы не устанавливаете приложение для всех пользователей, я не рекомендую его.

Дополнительная информация о реестре в MSDN

person Factor Mystic    schedule 28.09.2009
comment
немного запутался.. чем отличаются основные клавиши? какой мне поставить? текущий_пользователь, class_root, локальная_машина? как определить какой использовать? спасибо заранее - person user147685; 29.09.2009

Большое спасибо за ответы. очень ценю их..

Согласно заключению, 3 способа решения моей проблемы. в простом понятном подходе:

Добавление ярлыка тремя способами:

<сильный>1. создать прямо в окне реестра: http://www.codeguru.com/cpp/misc/misc/internetexplorer/article.php/c11007/

<сильный>2. ярлык доступен только для папок. http://www.codeproject.com/KB/cs/appendmenu.aspx http://blog.voidnish.com/?p =17

<сильный>3. ярлык доступен для всех файлов и папок. http://www.autoitscript.com/forum/index.php?showtopic=103265&view=findpost&p=731920

person user147685    schedule 05.10.2009