我在获取SendInput函数以产生任何类型的输出时遇到问题。所有结构都定义如下(我已将鼠标和硬件输出了):
[StructLayout(LayoutKind.Explicit)]
public struct INPUT
{
[FieldOffset(0)]
public int type;
[FieldOffset(8)]
public MOUSEINPUT mi;
[FieldOffset(8)]
public KEYBDINPUT ki;
[FieldOffset(8)]
public HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
我按以下方式发送密钥:
SetForegroundWindow(hProc); // using user32.dll switch to desired process
// send keydown
INPUT iKeyDown = new INPUT();
KEYBDINPUT sKeysDown = new KEYBDINPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki = sKeysDown;
sKeysDown.wVk = 0;
sKeysDown.wScan = (ushort)0x1E;
sKeysDown.dwFlags = 0x0008 ;
sKeysDown.time = 0;
sKeysDown.dwExtraInfo = GetMessageExtraInfo();
我以完全相同的方式发送Key Up事件,但dwFlags属性除外:
sKeysUp.dwFlags = 0x0008 | 0x0002;
最后,
INPUT[] aInputs = new INPUT[] { iKeyDown, iKeyUp };
uint result = SendInput(2, aInputs, Marshal.SizeOf(iKeyDown)); // when dll importing, SetLastError = true
int error = Marshal.GetLastWin32Error();
Debug.WriteLine(result.ToString() + " " + error.ToString());
结果是,没有可见输出,结果变量总是等于2(成功输入的数量),GetLastWin32Error()返回0(根据错误代码,它是成功的)。这里有什么我想念的吗?干杯!
答案 0 :(得分:0)
我已经回答了我自己的问题 - 我错误地填写了结构。而不是
INPUT iKeyDown = new INPUT();
KEYBDINPUT sKeysDown = new KEYBDINPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki = sKeysDown;
sKeysDown.wVk = 0; // etc
我应该一直在做
INPUT iKeyDown = new INPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki.wvK = 0; // etc
代替。新的KEYBDINPUT()搞砸了。我也确实将鼠标/键盘/硬件联合放在它自己独立的结构中,如GSerg建议的那样。现在它按预期工作。