我有一个带有包含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窗口消息来获取这些内容吗?
答案 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而不是挂钩消息泵?我怀疑你会得到更好的结果。