Консольное приложение C# + обработка событий

Всем привет. Я пытаюсь увидеть об обработке событий в консольном приложении. Я бы предпочел не использовать тихие WinForms (хотя я понимаю, что это один из способов) сделать это. Я перечитал похожий вопрос и ответ на него. См текст ответа ниже ( ссылка):

Основным требованием к потоку STA является то, что ему необходимо запустить насос сообщений. В Windows Forms вы можете использовать Application.Run. Или вы можете написать сообщение вручную, используя user32!GetMessage & DispatchMessage. Но, вероятно, проще использовать тот в WinForms или WPF.

Какова основная структура программы, которая использует "user32 -> GetMessage" и "user32 -> DispatchMessage"?

3 ответа

Решение

См. Раздел "Использование сообщений и очередей сообщений" в MSDN (в разделе "Разработка для Win32 и COM"> "Интерфейс пользователя"> "Работа с Windows"> "Управление Windows"> "Интерфейс пользователя Windows"> "Работа с окнами"> "Сообщения и очереди сообщений"). другие статьи и образцы в том же разделе). Краткое резюме, исключая обработку ошибок и используя синтаксис C вместо C# по причинам, обсуждаемым ниже:

RegisterClass(...);
CreateWindow(...);
ShowWindow(...);  // probably not in your case
while (GetMessage(&msg, NULL, 0, 0)) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

Как видно из шаблона настройки окна, он по-прежнему опирается на "тихие окна", хотя и созданные и прокачиваемые сообщениями через Win32 API, а не через WinForms. Таким образом, вы действительно ничего не получаете, поступая таким образом. Следовательно, я чувствую, что нет смысла переводить этот материал на C# - если единственным решением вашей проблемы является невидимое окно, вы также можете использовать невидимую форму Windows и все дружественные оболочки, которые поставляются с этой платформой.

Однако, если вы на самом деле не используете элемент управления Windows Forms, такой как плакат связанного вопроса, тогда вы вполне можете использовать события.NET в консольном приложении. Ограничение в отношении STA и необходимость в прокачке сообщений характерны для получения событий от WinForms и элементов управления ActiveX, таких как WebBrowser (или сообщений от Win32 HWND, хотя для этого необязательно требуется STA).

Какие события вы хотите обработать? Настройка рассылки сообщений позволит вам обрабатывать сообщения Windows API. Но так как это консольное приложение, я не могу думать ни о каких сообщениях Windows API, которые были бы интересны.

Мы склонны считать "события" связанными с сообщениями Windows, поскольку элементы управления в приложении Windows Forms реагируют на ввод пользователя с помощью делегатов EventHandler, которые вызываются в ответ на сообщения Windows API. Однако нет причин, по которым вы не можете использовать делегатов в консольном приложении; и вам не нужен насос сообщений. Вы даже можете использовать делегат EventHandler, хотя он будет казаться неуместным, потому что он не будет резонировать с сообщениями Windows API.

Конечно, есть другие виды "событий", которые могут вас заинтересовать. Наиболее распространенный тип сценария событий, включающий консольное приложение, - это ожидание ввода с консоли (stdin). Также обычно блокируют WaitHandle или другой объект синхронизации, если используется несколько потоков. Оба эти случая могут рассматриваться как тип обработки событий.

Если вы создадите скрытое окно (проверенная временем практика), вам все равно понадобится сообщение Windows для ответа. Итак, вопрос в том, что или кому вы пытаетесь ответить?

Я бы использовал метод Application.Run. Я не думаю, что он автоматически создает скрытое окно, он просто качает сообщения, и это то, что вам нужно для удовлетворения требований STA.

Написание собственной рассылки сообщений с использованием PInvoke не дает никаких преимуществ, а ссылки на System.Windows.Forms не являются обременительными, поскольку они уже есть на каждой машине, с которой вы можете столкнуться.

Другие вопросы по тегам