bit*_*cle 6 c# console-application event-handling
大家好。我正在尝试了解如何在控制台应用程序中处理事件。我宁愿不使用静默的 WinForms(尽管我明白这是一种方法)来做到这一点。我已经阅读了一个类似的问题及其回应。请参阅下面的回复文本(链接):
STA 线程的基本要求是它需要运行消息泵。在 Windows 窗体中,您可以使用 Application.Run。或者您可以使用 user32!GetMessage 和 DispatchMessage 手动编写消息泵。但是在 WinForms 或 WPF 中使用它可能更容易。
使用“user32 -> GetMessage”和“user32 -> DispatchMessage”的程序的基本结构是什么?
请参阅 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);
}
Run Code Online (Sandbox Code Playgroud)
正如您从窗口设置样板中看到的,这仍然依赖于“静默窗口”,尽管它是通过 Win32 API 而不是通过 WinForms 创建和消息泵送的。所以你这样做并没有真正获得任何好处。因此,我觉得将这些东西翻译成 C# 没有多大意义——如果问题的唯一解决方案是一个不可见的窗口,那么您也可以使用不可见的 Windows 窗体以及该平台附带的所有友好包装器。
但是,如果您实际上并未使用 Windows 窗体控件(如链接问题的海报),那么您可以非常愉快地在控制台应用程序中使用 .NET 事件。对 STA 的限制和对消息泵的需求特定于从 WinForms 和 ActiveX 控件(如 WebBrowser)接收事件(或来自 Win32 HWND 的消息,尽管这不一定需要 STA)。