WPF WIN32 hwndhost WM_MOUSEMOVE WM_MOUSEHOVER

WPF WIN32 hwndhost WM_MOUSEMOVE WM_MOUSEHOVER,wpf,winapi,controls,host,Wpf,Winapi,Controls,Host,我有一个WPF应用程序,其中包含一个HwndHost的usercontrol。HwndHost的创建如下所示: hwndHost = CreateWindowEx(0, "static", "", WS_CHILD | WS_VISIBLE, 0, 0, hostHeight, hostWidth,

我有一个WPF应用程序,其中包含一个HwndHost的usercontrol。HwndHost的创建如下所示:

  hwndHost = CreateWindowEx(0, "static", "",
                            WS_CHILD | WS_VISIBLE,
                            0, 0,
                            hostHeight, hostWidth,
                            hwndParent.Handle,
                            (IntPtr)HOST_ID,
                            IntPtr.Zero,
                            0);

  hwndControl = CreateWindowEx(0, "Static", "",
                                WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN
                                  ,
                                0, 0,
                                hostHeight, hostWidth,
                                hwndHost,
                                (IntPtr)PICTUREBOX_ID,
                                IntPtr.Zero,
                                0);
然后,我使用HwndSourceHook钩住消息泵,大量的消息就通过了

除了我想要的东西,比如WM_MOUSEMOVE、WM_MOUSEHOVER、WM_LBUTTONDOWN和WM_LBUTTONUP

另外,OnMouseLeftButtonDown事件并没有在主窗口或控件的WPF代码中触发,我假设是因为windows正在捕获它并将其丢弃


有人知道我如何通过WIN32 window消息或不使用WIN32 window消息来传递这些消息吗?

为什么不注册一个WndClass并将消息传递到您自己的WndProc,而不是挂接消息泵?我想你会得到更好的结果。

为什么不注册一个WndClass并将消息发送到你自己的WndProc,而不是挂起消息泵呢?我怀疑您会得到更好的结果。

WPF中的Border元素似乎可以防止抛出OnMouseLeftButtonDown。在找到更好的方法之前,我的临时解决方案是将WPF边框更改为WPF按钮,然后触发所有鼠标事件


这对大多数人来说并不理想,但当我使用它来渲染3D时,它下面是什么并不重要。

WPF中的边框元素似乎可以防止抛出OnMouseLeftButtonDown。在找到更好的方法之前,我的临时解决方案是将WPF边框更改为WPF按钮,然后触发所有鼠标事件


这对大多数人来说并不理想,但当我使用它来渲染3D时,它下面是什么并不重要。

您需要处理WM\n chittest。除非你这么做,否则它不会向你发送鼠标消息

// C++/CLI implementation of HwndHost.WndProc().
virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, bool% handled) override
{
    switch (msg)
    {
        case WM_NCHITTEST:
        {
            handled = true;
        return IntPtr(HTCLIENT);
        }
    }

    return IntPtr::Zero;
}

你需要处理WM_nchitest。除非你这么做,否则它不会向你发送鼠标消息

// C++/CLI implementation of HwndHost.WndProc().
virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, bool% handled) override
{
    switch (msg)
    {
        case WM_NCHITTEST:
        {
            handled = true;
        return IntPtr(HTCLIENT);
        }
    }

    return IntPtr::Zero;
}

我正在连接WndProc,我想这会给我发送的每一条信息。您知道我可以向WPF注册WndClass吗?我不确定您做错了什么,但可能是您在WndProc链中的位置不对?我对WPF还不太熟悉,无法说明您将如何操作,但如果您可以调用CreateWindowEx,我不明白您为什么不能调用RegisterClass。好的,谢谢,我会研究一下。我怀疑可能还有其他干扰因素,比如我正在将Hwnd传递给的Ogre3D引擎,以便它可以渲染到我的窗口。你应该能够使用Spy++查看窗口链以及消息正在消失的位置。我正在连接WndProc,我想这会给我发送的所有消息。您知道我可以向WPF注册WndClass吗?我不确定您做错了什么,但可能是您在WndProc链中的位置不对?我对WPF还不太熟悉,无法说明您将如何操作,但如果您可以调用CreateWindowEx,我不明白您为什么不能调用RegisterClass。好的,谢谢,我会研究一下。我怀疑可能还有其他干扰因素,如我将Hwnd传递给的Ogre3D引擎,以便它可以渲染到我的窗口。您应该能够使用Spy++查看窗口链以及消息消失的位置。更新:OnMouseLeftButtonUp在WPF中触发,但不是OnMouseLeftButtonDown。丢失plot.com?更新:在WPF中OnMouseLeftButtonUp起火,但不是OnMouseLeftButtonDown。失去了plot.com?