WPF WIN32 hwndhost WM_MOUSEMOVE WM_MOUSEHOVER

时间:2010-03-25 15:41:47

标签: wpf winapi controls host

我有一个带有包含HwndHost的usercontrol的WPF应用程序。 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代码中触发,我假设因为窗口正在捕获它并将其丢弃。

有人知道如何使用或不使用WIN32窗口消息来获取这些内容吗?

3 个答案:

答案 0 :(得分:3)

您需要处理WM_NCHITTEST。在此之前,它不会向您发送鼠标消息。

// 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;
}

答案 1 :(得分:1)

看起来WPF中的Border元素会阻止抛出OnMouseLeftButtonDown。我的临时解决方案直到找到更好的解决方案是将WPF边框更改为WPF按钮,然后触发所有鼠标事件。

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

答案 2 :(得分:0)

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