[英]WinApi - PeekMessage Always Returns False
我无法让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
}
}
解决了:
Show()
来显示我的表单 (感谢您显示我的错误)
当为hWnd
参数传递NULL
(即0)时, PeekMessage
函数将检索线程消息以及属于当前线程的任何窗口的消息。 在文档中明确指出了这一点:
hWnd [in,可选]
要获取其消息的窗口的句柄。 该窗口必须属于当前线程。
如果hWnd为
NULL
,则PeekMessage
检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中hwnd值为NULL
的消息(请参阅MSG
结构)。 因此,如果hWnd为NULL
,则将同时处理窗口消息和线程消息。
由于您是在ThreadPool中的新线程上调用此函数的,因此没有可供检索的消息。 该线程不与任何窗口关联,也没有消息。
没有可用消息时,该函数返回FALSE
(即0)。
如果您在主UI线程(与表单相关联的线程)上调用PeekMessage
,则将窥视发往表单窗口的所有消息。
窗口消息队列是每个线程的,除非以某种方式关联( AttachThreadInput
,窗口父关系...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.