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,而不是钩住消息泵?我怀疑您会得到更好的结果。