我在原始输入窗口过程中有一个奇怪的问题,我无法弄清楚我的生活.
每次Esc按下该键,我的代码在第一次GetRawInputData()调用时都会遇到0x80004005(无效句柄)异常.它似乎只发生在Esc键上:
protected override void WndProc(ref Message message)
{
switch ((WM)message.Msg)
{
case WM.INPUT:
{
if (message.LParam == IntPtr.Zero)
{
break;
}
InputData rawBuffer;
var dwSize = 0;
//Invalid handle on this call, only with escape.
var res = User32.GetRawInputData(message.LParam, DataCommand.RID_INPUT, IntPtr.Zero, ref dwSize, Marshal.SizeOf(typeof(RawInputHeader)));
if (res != 0)
{
var ex = new Win32Exception(Marshal.GetLastWin32Error());
Logger.Error(ex, "Error sizing the rawinput buffer: {0}", ex.Message);
break;
}
res = User32.GetRawInputData(message.LParam, DataCommand.RID_INPUT, out rawBuffer, ref dwSize, Marshal.SizeOf(typeof(RawInputHeader)));
if (res == -1)
{
var ex = new Win32Exception(Marshal.GetLastWin32Error());
Logger.Error(ex, "Error getting the rawinput buffer: {0}", ex.Message);
break;
}
if (res == dwSize)
{
foreach (var device in _devices)
{
device.ProcessRawInput(rawBuffer);
}
}
else
{
//Something is seriously f'd up with Windows - the number of bytes copied does not match the reported buffer size.
}
}
break;
}
base.WndProc(ref message);
}
Run Code Online (Sandbox Code Playgroud)
结构定义:
[StructLayout(LayoutKind.Sequential)]
public struct RawInputHeader
{
public uint dwType;
public uint dwSize;
public IntPtr hDevice;
public IntPtr wParam;
}
Run Code Online (Sandbox Code Playgroud)
窗口过程是否有问题,或者周围有些奇怪Esc而且GetRawInputData()我不知道?
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |