1

我有一个包含 HwndHost 的用户控件的 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

此外,在主窗口或控件上的 WPF 代码中不会触发 OnMouseLeftButtonDown 事件,我认为是因为 Windows 正在捕获它并将其丢弃。

任何人都知道我怎样才能让这些通过,无论是否使用 WIN32 窗口消息?

4

3 回答 3

4

您需要处理 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;
}
于 2010-11-10T19:30:54.703 回答
1

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

对大多数人来说并不理想,但当我使用它在其上渲染 3D 时,它下面的内容并不重要。

于 2010-04-14T12:17:59.273 回答
0

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

于 2010-03-25T15:44:06.757 回答