C # winform открывается с помощью контекстного меню, вызываемого щелчком правой кнопкой мыши, но как мне отобразить выбранный элемент?

У меня есть приложение C # WinForm, которое я создал для хранения файлов в отдельном безопасном месте на жестком диске. Я пытаюсь добавить в программу функциональные возможности, добавляя контекстное меню, вызываемое щелчком правой кнопкой мыши, поэтому, когда пользователь щелкает правой кнопкой мыши файл (или группу файлов) в Windows, моя программа появляется в контексте, который они могут выбрать. Нет проблем, у меня эта часть проработана. Мне нужно программно получить этот список файлов и отправить его программе, чтобы они уже были перечислены в списке.

Я уже делаю что-то подобное с множественным выбором в OFD, но я не хочу, чтобы им приходилось открывать программу, выбирать просмотр, находить файлы и выбирать их, когда они уже выбрали их в окнах.

Существует множество программ, которые имеют эту функциональность (например, свойства плюс, текстовая панель и т. Д.). Мне просто нужно толкнуть в правильном направлении, чтобы помочь мне разобраться в этом.

Заранее спасибо,

Дэйв


person Dave_P    schedule 01.04.2011    source источник
comment
Вы, вероятно, имеете в виду обработчик расширения оболочки. В .NET это вообще не поддерживается. Вы найдете что-то, если погуглите строку в кавычках.   -  person Hans Passant    schedule 01.04.2011


Ответы (3)


Если я правильно понимаю, что вы уже реализовали, тогда все файлы должны появиться в качестве аргументов в командной строке программы. Вам просто нужен способ извлечь каждый из этих путей к файлам и отобразить их в виде списка.

В C # следующий код отобразит окно сообщения, содержащее каждый аргумент командной строки:

static void Main(string[] args)
{
    foreach(string arg in args)
    {
        MessageBox.Show(arg);
    }
}

Но если вы не хотите получать к ним доступ в методе Main, вы также можете использовать класс Environment, который предоставляет статический _ 4_ метод. Он возвращает тот же массив строк, содержащий аргументы, и вы можете таким же образом перебрать его.

person Cody Gray    schedule 01.04.2011
comment
Вы молодец, спасибо ... но ... теперь я добавляю каждый аргумент в ArrayList и отправляю этот список классу. Теперь он открывает экземпляр моей программы для каждого аргумента, а не просто открывает его один раз для всех аргументов. что я сделал, чтобы это произошло. - person Dave_P; 02.04.2011
comment
См. Мой ответ, который я опубликовал ниже. - person Dave_P; 02.04.2011

Вот статья о том, как настроить параметры контекстного меню в Windows

Затем, как говорит #CodyGray, используйте string[] args в вашем Main методе вашей программы, чтобы получить имена файлов

person openshac    schedule 01.04.2011

Я собираю все аргументы и отправляю их в ArrayList.

    static void Main(string[] args)
    {
        ArrayList myAL = new ArrayList();

        foreach (string arg in args)
        {
            myAL.Add(arg);
        }

        ALRec nalr = new ALRec();
        nalr.getArrList(myAL);

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

отправка его в класс ALRec

class ALRec 
{
    ArrayList MyArrLst = new ArrayList();

    public void getArrList(ArrayList AL)
    {
        MyArrLst = AL;
    }
}

Почему запускается несколько экземпляров моего приложения?

person Community    schedule 02.04.2011
comment
Вы перепутали подсветку синтаксиса (и меня) с вашими соглашениями о заглавных буквах. Как правило, локальные переменные и переменные уровня класса имеют camelCase, а имена функций - PascalCased. В любом случае, этот код определенно не запускает несколько экземпляров вашего приложения. Команда Application.Run вызывается только один раз, что означает, что запускается только один экземпляр. Проблема, очевидно, в том, как вы зарегистрировали обработчик контекстного меню в оболочке. Как говорит Ганс, это, наверное, самая сложная часть. Я предполагаю, что Windows создает новый экземпляр вашего приложения для каждого из - person Cody Gray; 03.04.2011
comment
... выбранные вами файлы, а не отправлять их все в один и тот же экземпляр в командной строке. Можете ли вы показать нам код, который вы использовали для добавления приложения в реестр в качестве обработчика файлов? - person Cody Gray; 03.04.2011
comment
Единственная работа с реестром, которую я проделал, - это добавление команды оболочки. hklm \ software \ classes * \ shell \ Имя контекстного меню \ command. строковое значение, установленное в команде, - app.exe% 1, поскольку я поместил app.exe в папку system32, мне не нужно было указывать путь. - person Dave_P; 04.04.2011
comment
... и вы правы, он запускает несколько экземпляров приложения только при выборе нескольких файлов. Я еще не успел указать, добавляет ли он 1 файл к каждому экземпляру (в отличие от всех файлов в одном или еще много чего). - person Dave_P; 04.04.2011
comment
@Dave_P: Первая проблема в том, что вы добавили приложение в system32. Эта папка не для приложений. Вся папка Windows запрещена. Вторая проблема заключается в том, как вы добавили обработчик в реестр. Это вполне допустимый (и самый простой) способ сделать это, но предостережение в том, что он будет открывать новый экземпляр приложения для каждого файла, который он зарегистрировал для обработки. Он не знает, что должен передать их все в одно приложение. Вы можете выбрать 10 различных типов файлов, и все они будут открываться в своих собственных зарегистрированных приложениях-обработчиках. - person Cody Gray; 04.04.2011
comment
В этом вопросе содержится некоторая информация об альтернативном подходе, который позволит вам открывать несколько выбранных файлов в одном экземпляре вашего приложения: stackoverflow.com/ questions / 3605903 / - person Cody Gray; 04.04.2011