问题在于:
我写了一个WPF应用程序,它使用Hwnd来托管绘图表面。那个hwnd负责发回发生的鼠标事件。在我的电脑上,一切正常,我看到522(0x020A)鼠标滚轮信息没有问题。
我在另一台计算机上安装了同样的软件,但事件并没有发生。我甚至将所有事件消息记录到一个文件中,以查看522是否完全被触发,并且它从未出现过。
我尝试的事情:
- 确保Hwnd有焦点。我不仅制作了一个每秒重新聚焦一次的线程,我确保在我的计算机上工作(工作)" IsFocused"对于那个人来说是真实的。
- 关闭任何其他正在运行的程序。这包括在后台运行的计算机的正常情况,以防某些事情正在关注。
- 切换鼠标。我使用我在计算机上使用的鼠标确定,但它仍无法在新计算机上运行。
以下是基本代码:
public abstract class Win32HwndControl : HwndHost
{
protected IntPtr Hwnd { get; private set; }
protected bool HwndInitialized { get; private set; }
private const string WindowClass = "HwndWrapper";
protected Win32HwndControl()
{
}
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
var wndClass = new NativeMethods.WndClassEx();
wndClass.cbSize = (uint)Marshal.SizeOf(wndClass);
wndClass.hInstance = NativeMethods.GetModuleHandle(null);
wndClass.lpfnWndProc = NativeMethods.DefaultWindowProc;
wndClass.lpszClassName = WindowClass;
wndClass.hCursor = NativeMethods.LoadCursor(IntPtr.Zero, NativeMethods.IDC_ARROW);
NativeMethods.RegisterClassEx(ref wndClass);
Hwnd = NativeMethods.CreateWindowEx(
0, WindowClass, "", NativeMethods.WS_CHILD | NativeMethods.WS_VISIBLE,
0, 0, (int)Width, (int)Height, hwndParent.Handle, IntPtr.Zero, IntPtr.Zero, 0);
return new HandleRef(this, Hwnd);
}
protected override IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case NativeMethods.WM_LBUTTONDOWN:
RaiseMouseEvent(MouseButton.Left, Mouse.MouseDownEvent);
break;
case NativeMethods.WM_LBUTTONUP:
RaiseMouseEvent(MouseButton.Left, Mouse.MouseUpEvent);
break;
case NativeMethods.WM_RBUTTONDOWN:
RaiseMouseEvent(MouseButton.Right, Mouse.MouseDownEvent);
break;
case NativeMethods.WM_RBUTTONUP:
RaiseMouseEvent(MouseButton.Right, Mouse.MouseUpEvent);
break;
case NativeMethods.WM_MOUSEWHEEL:
RaiseMouseWheelEvent(wParam.ToInt32(), Mouse.MouseWheelEvent);
break;
}
return base.WndProc(hwnd, msg, wParam, lParam, ref handled);
}
这个类有更多的代码,但我已经证实它没有达到WndProc方法。
关于为什么会在一台计算机上而不是另一台计算机上发生这种情况的任何提示?