是否只有一个"消息泵",或许多?

4 .net c#

我是.NET和Windows的新手,我正在试图弄清楚如何将遗留代码集成到我的C#项目中.拥有该代码的人说他只需要"消息泵"和"空闲处理".

经过一些谷歌搜索,听起来至少MFC,Windows FormsWin32都有自己的消息泵?这是真的?

我的C#代码是一个控制台应用程序,我知道它根本没有任何消息泵.我以为那些只是GUI的东西(?).

那么,当我说他需要一个"消息泵"时,我需要在我的C#代码中做些什么来使他的旧代码工作?

我需要使用的代码已经在GUI应用程序中使用.现在我需要在服务器中使用它,并且有点害怕需要GUI消息泵.我的代码是纯粹的C#,根本没有任何GUI内容.只是一些数字运算和I/O.

Nir*_*Nir 8

让我先介绍一下消息和消息泵的背景知识.

在Windows中,GUI应用程序通过处理消息来工作.例如,当您移动鼠标时,Windows会向鼠标下的窗口发送WM_MOUSEMOVE消息.

Windows将消息发布到窗口所属线程的"消息队列",并且有人必须将此消息路由到特定窗口.有人是消息泵.

每个Windows UI框架都有一个消息泵,最简单的消息泵看起来像这样(这个代码示例是用C++编写的;你可以使用interop在.NET中编写它):

MSG msg;
while(GetMessage(&msg, hwnd, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)

每个GUI程序都必须有一个消息泵,但命令行程序只需运行上面的代码即可启动消息泵.显然,由于您没有打开窗口,因此您不会从操作系统获得任何消息.要将消息插入队列,请使用PostThreadMessage.


SLa*_*aks 5

要在.NET中运行消息泵,请调用Application.Run();.这是一个阻塞调用,只有在程序收到退出消息时才会完成运行.(通常,如果系统正在关闭).它通常由需要等待特定事件的程序使用.(当然,还有常规的GUI应用程序.)

然后,您可以处理该Application.Idle事件.

如果需要处理Windows消息,可以创建隐藏表单,覆盖其WndProc方法并将其传递给Application.Run.

即使在服务器进程中,您也可以完成所有这些操作.