所以,我的小测试应用程序遇到了一个非常奇怪的问题.问题是,我的意思是崩溃......很难.没有例外(至少,我没有抓到任何东西)被抛出,只是"Blah Blah已经停止响应......"的消息.它崩溃只有当我在运行应用程序64,发行方式和外界的IDE.如果我在x86模式下运行它,或者我在x64中的IDE中运行它,或者我在x64中独立运行它作为DEBUG它可以正常工作.
我把它缩小到我的p/invoke PeekMessage调用.所以,我需要聪明的头脑来看看我写的废话并告诉我,如果我做得对.因为,严肃地说,我即将失去我的头脑.我在2台计算机上试过这个,它们都表现出相同的行为.我有点担心这可能是.NET 4.0的错误.
无论如何,这是我的p/invoke代码.如果你看到任何奇怪或简单的愚蠢,请告诉我:
这是对PeekMessage的调用:
private static bool PeekMessage()
{
MSG message = new MSG(); // Message to retrieve.
return Win32API.PeekMessage(ref message, IntPtr.Zero, 0, 0, PeekMessageFlags.NoRemove);
}
Run Code Online (Sandbox Code Playgroud)
这是PeekMessage(注意:抑制安全性属性在类定义上,因此它正在应用):
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("User32.dll", CharSet=CharSet.Auto)]
public static extern bool PeekMessage(ref MSG msg, IntPtr hwnd, uint wFilterMin, uint wFilterMax, PeekMessageFlags flags);
Run Code Online (Sandbox Code Playgroud)
这是味精:
[StructLayout(LayoutKind.Sequential)]
internal struct MSG
{
/// <summary>Window handle.</summary>
public IntPtr hwnd;
/// <summary>Message to process.</summary>
public uint Message;
/// <summary>Window message parameter 1.</summary>
public uint wParam; …Run Code Online (Sandbox Code Playgroud) 当我在通过 RDP 登录时尝试从lLastX, 和结构lLastY成员更新我的鼠标位置RAWMOUSE时,我得到了一些非常奇数的数字(例如两者都大于 30,000)。我在 Windows 7、8、8.1 和 10 上注意到了这种行为。
usFlags 成员返回 的值MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP。关于MOUSE_MOVE_ABSOLUTE,我在我的代码中处理绝对定位和相对定位。但是,虚拟桌面标志让我有点困惑,因为我认为该标志用于多显示器设置。我有一种感觉,这与那面旗帜和我得到的奇怪数字有关。不幸的是,我真的不知道如何在没有参考点的情况下调整值,我什至不知道如何获得参考点。
当我在本地运行代码时,一切正常。
那么有没有人知道为什么 RDP + 原始输入会给我这样混乱的鼠标 lastx/lasty 值?如果是这样,有没有办法将它们转换为更合理的值?