Как передать аргумент командной строки приложению Windows C # формы во время его работы - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть среда приложения ac # windows forms 2.0

Я хочу иметь возможность передавать команду из другого процесса или из командной строки в мое приложение windows form во время работы моего приложения.Как я могу отправить и как я могу получить?

Я знаю, что это можно сделать с помощью IPC, но я пока не хочу туда идти, так как эта функция передачи аргументов будет использоваться редко, и я пытаюсь внести минимальные измененияв приложении Windows Forms, насколько это возможно.

edit: Прямо сейчас я запускаю приложение Windows Form, дважды щелкнув значок. Можно ли запустить его из командной строки как процесс (консольное приложение ???) иотправлять команды из командной строки?

Редактировать: Дополнительные пояснения: Команда вводится пользователем.

Ответы [ 6 ]

7 голосов
/ 16 февраля 2012

Невозможно передать аргументы уже запущенной программе.

Стандартный метод для этого, как вы упомянули, - это запуск нового экземпляра для получения аргументов, обнаружение уже запущенного экземпляра и отправка ему команд через IPC.

Как уже упоминалось в комментариях к некоторым другим ответам, возможно, что приложение будет непрерывно считывать данные из командной строки. Это называется поток Standard Input и доступен в .NET через класс Process.StandardInput, задокументированный здесь . Аналогично, приложения также имеют стандартный вывод и стандартные потоки ошибок.

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

3 голосов
/ 16 февраля 2012

Вы можете использовать стандартный поток ввода процессов в качестве альтернативы или именованный канал, файл отображения памяти и т. Д.

Существует две возможности обмена данными между двумя программами или общения друг с другом.

Вы не можете указать / изменить параметры командной строки после того, как программа уже запущена.

Обновление:

так что я вижу много приложений C ++, запущенных из командной строки, и пользователь продолжает передача команд оттуда.

Они используют одну из опций, которые я перечислил здесь (или что-то похожее, чего я не перечислил; существует множество способов общения разных программ друг с другом).

Есть ли способ сделать то же самое с приложением форм c # windows?

Все вышеперечисленное должно работать только в приложении Windows Forms. Некоторые могут быть проще, чем другие, но все они возможны.

или мне нужно сделать это консольным приложением, а затем как-нибудь запустить интерфейс часть этого?

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

1 голос
/ 18 февраля 2012

Я в основном запустил новую TCP-связь между моим приложением windows form и клиентским приложением.

Мое приложение windows становится сервером сокетов и клиентом как клиентом, поэтому, когда пользователь хочет отправить команду, он может установитьсоединение и отправить его.

Спасибо за ценный вклад ... Я кое-чему научился.

1 голос
/ 16 февраля 2012

Хм, когда ваше приложение запускается, пусть оно увидит, запущено ли уже это приложение, если оно есть, то просто примите аргументы и сохраните эту информацию в папке кэша и выйдите из второго экземпляра вашего приложения.

Первый экземпляр вашего приложения должен отслеживать изменения в этой папке и, если что-то меняется, извлекать эти данные и использовать их.

И, пожалуйста, не говорите мне, что это слишком глупо или "неэффективно", потому что это просто делает вещи ... нет необходимости делать слишком сложные вещи.

0 голосов
/ 16 февраля 2012

Независимо от того, что вы делаете, вам придется внести некоторые изменения в ваше приложение Windows Forms, я думаю, хотя вы, возможно, сможете сделать что-то волшебное, отправив ему сообщения win32 через win32 SendMessage() /PostMessage() функции.Это будет работать до тех пор, пока это сообщение, которое ожидает ваше приложение winforms.

В процессе вы будете дружить с вещами взаимодействия.Некоторые ссылки для использования сообщений win32 в качестве механизма IPC:

Также можно использовать System.IO.Pipes .

Первый запускаемый экземпляр - это «сервер».Он должен создать именованный канал, создав экземпляр NamedPipeServerStream и прослушивая его.

Любому, кто хочет общаться с сервером, - нужны ли ему другие экземпляры вашего приложения, приложения командной строки и т. Д.чтобы создать экземпляр NamedPipeClientStream и подключиться к нему.

Вот пример: http://www.switchonthecode.com/tutorials/dotnet-35-adds-named-pipes-support

Ваше приложение win32 должно будет отслеживать канал сервера для обработки входящего сообщения в канале.

0 голосов
/ 16 февраля 2012

Любое приложение имеет параметр командной строки - поэтому, если вы просто хотите передать их один раз при запуске - просто сделайте это.

В противном случае вам нужно консольное приложение, которое показывает формы - то есть см. как запустить winform из консольного приложения? .

Примечание. Хотя одновременное использование консоли и окна возможно, взаимодействие с пользователем может быть затруднительным. Попробуйте добавить в форму простое текстовое поле «команда» для ввода команд. То есть VisualStudio имеет несколько «командных» окон в качестве примера - «Немедленно», где вы можете выполнить код снова запускаемой программы, «Searc» / «Команда» - перейти к текстовому полю поиска на панели инструментов (или Ctrl + /) и ввести> open. *

...