关于winapi:WPF WIN32 hwndhost WM_MOUSEMOVE WM_MOUSEHOVER

WPF WIN32 hwndhost WM_MOUSEMOVE WM_MOUSEHOVER

我有一个WPF应用程序,其用户控件包含一个HwndHost。 HwndHost的创建如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  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事件,因为窗口正在捕获它并将其丢弃。

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


您需要处理WM_NCHITTEST。除非您这样做,否则不会向您发送鼠标消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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;
}

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

对于大多数人来说并不理想,但是由于我使用它在其上渲染3D并不重要。


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