繁体   English   中英

WinApi-PeekMessage总是返回False

[英]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()来显示我的表单
  • 并重定向了主线程以记录消息
  • (不是XY问题,我需要PeekMessage才能工作,或者至少要了解如何使用它)

(感谢您显示我的错误)

当为hWnd参数传递NULL (即0)时, PeekMessage函数将检索线程消息以及属于当前线程的任何窗口的消息。 文档中明确指出了这一点:

hWnd [in,可选]

要获取其消息的窗口的句柄。 该窗口必须属于当前线程。

如果hWnd为NULL ,则PeekMessage检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中hwnd值为NULL的消息(请参阅MSG结构)。 因此,如果hWndNULL ,则将同时处理窗口消息和线程消息。

由于您是在ThreadPool中的新线程上调用此函数的,因此没有可供检索的消息。 该线程不与任何窗口关联,也没有消息。

没有可用消息时,该函数返回FALSE (即0)。

如果您在主UI线程(与表单相关联的线程)上调用PeekMessage ,则将窥视发往表单窗口的所有消息。

窗口消息队列是每个线程的,除非以某种方式关联( AttachThreadInput ,窗口父关系...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM