我是.NET和Windows的新手,我正在试图弄清楚如何将遗留代码集成到我的C#项目中。拥有该代码的人说他只需要“消息泵”和“空闲处理”。
经过一些谷歌搜索,听起来至少MFC,Windows Forms和Win32都有自己的消息泵?这是真的吗?
我的C#代码是一个控制台应用程序,据我所知,根本没有任何消息泵。我以为那些只是GUI的东西(?)。
那么,当我说他需要一个“消息泵”时,我需要在我的C#代码中做些什么来使他的旧代码工作?
我需要使用的代码已在GUI应用程序中使用。现在我需要在服务器中使用它,并且有点害怕需要GUI消息泵。我的代码是纯粹的C#,根本没有任何GUI内容。只是一些数字运算和I / O.
答案 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 Forms窗口并使其不可见来解决此问题。
当您致电Application.Run
时,Windows窗体将启动您的消息泵。您可以将该窗口的HWND传递给它,它可能知道如何处理它。如果要捕获发回的邮件,可以覆盖表单WndProc。这只会捕捉发送到该窗口的消息...