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

时间:2009-06-10 09:30:33

标签: c# .net

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

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

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

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

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

MSG msg;
while(GetMessage(&msg, hwnd, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

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

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:2)

你是对的。在Windows中,消息泵是“GUI事物”,尽管它们的用途远不止于此(热键通知等)。

进程可以为每个线程提供一个消息泵。通常这些是在创建第一个窗口时创建的。控制台应用程序没有消息泵。您可以通过创建Windows Forms窗口并使其不可见来解决此问题。

当您致电Application.Run时,Windows窗体将启动您的消息泵。您可以将该窗口的HWND传递给它,它可能知道如何处理它。如果要捕获发回的邮件,可以覆盖表单WndProc。这只会捕捉发送到该窗口的消息...