Bit*_*lue 1 c# winapi peekmessage winforms
我无法让 PeekMessage 工作。实际上,我希望它用消息淹没我,但它的返回值为 0。
我使用 WinForm,启动一个正在查看消息的后台线程并使用鼠标使用窗口。该窗口可以像往常一样使用,但无法查看任何消息。我究竟做错了什么 ?最后一个错误始终为 0。
[StructLayout(LayoutKind.Sequential)]
public struct NativeMessage
{
public IntPtr handle;
public uint msg;
public IntPtr wParam;
public IntPtr lParam;
public uint time;
public Point p;
public override string ToString()
{
return handle + ", " + msg + ", " + wParam + ", " + lParam + ", " + time + ", " + p;
}
}
[DllImport("user32.dll")]
public static extern int PeekMessage(out NativeMessage lpMsg, IntPtr window, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);
public Form1()
{
ThreadPool.QueueUserWorkItem(o => run());
}
private void run()
{
for (int i = 0; i < 1000000; )
{
NativeMessage a = new NativeMessage();
int c = PeekMessage(out a, IntPtr.Zero, (uint) 0, (uint) 0, (uint) 0);
if (c != 0)
trace(" -> " + c); // prints strings
}
}
Run Code Online (Sandbox Code Playgroud)
解决了:
Show()在主线程中调用以显示我的表单(感谢您向我展示我犯的错误)
当您NULL为hWnd参数传递(即 0)时,该PeekMessage函数将检索线程消息以及属于当前线程的任何窗口的消息。这在文档中明确指出:
hWnd [输入,可选]
要检索其消息的窗口的句柄。窗口必须属于当前线程。
如果 hWnd 是
NULL,则PeekMessage检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中hwnd值为NULL(参见MSG结构)的任何消息。因此,如果hWnd是NULL,窗口消息和线程消息都会被处理。
由于您是在 ThreadPool 中的新线程上调用此函数,因此它没有要检索的消息。该线程不与任何窗口关联并且没有消息。
FALSE当没有可用消息时,该函数返回(即 0)。
如果您正在调用PeekMessage主 UI 线程(与您的表单相关联的线程),您将看到所有发往表单窗口的消息。