使用SendInput自动化按键
当我尝试使用SendInput
发送单键按键和组合按键时,我无法让程序按住键盘按钮直到命令被释放。 使用下面的代码,我可以通过首先按下shift来发送字符'a'
和'A'
。 但是,我不能永久地拿着'a'
按钮。
public static void KeyDown() { SwitchWindow(Process.GetProcessesByName("notepad").FirstOrDefault().MainWindowHandle); INPUT[] inputs = new INPUT[1]; KEYBDINPUT kb = new KEYBDINPUT(); //Set up generic keyboard event inputs[0].type = INPUT_KEYBOARD; kb.wScan = 0; // hardware scan code for key kb.time = 0; kb.dwExtraInfo = IntPtr.Zero; kb.dwFlags = 0; // 0 for key press //Press shift kb.wVk = (ushort)KeyCode.SHIFT; inputs[0].ki = kb; SendInput(1, inputs, Marshal.SizeOf(inputs[0])); //Press 'a' key kb.wVk = (ushort)0x41; // virtual-key code for the "a" key inputs[0].ki = kb; SendInput(1, inputs, Marshal.SizeOf(inputs[0])); //Release 'a' key kb.dwFlags = KEYEVENTF_KEYUP; kb.wVk = (ushort)0x41; // virtual-key code for the "a" key inputs[0].ki = kb; SendInput(1, inputs, Marshal.SizeOf(inputs[0])); //Release 'shift' key kb.dwFlags = KEYEVENTF_KEYUP; kb.wVk = (ushort)KeyCode.SHIFT; // virtual-key code for the "a" key inputs[0].ki = kb; SendInput(1, inputs, Marshal.SizeOf(inputs[0])); }
任何想法,如果我删除最后两个SendInput
,它不只是'A'
下来?
为了其他正在搜索如何在C#中使用SendInput()的人的利益,请参阅以下说明。
1)使用Scancode或虚拟密钥代码 ,使用SendInput()发送击键有两种方法
2)如果您打算将键击发送到从Direct 3D(或其他DirectInput环境)获取输入的游戏或其他应用程序,则需要将键击作为扫描码发送,因此您指定wScan字段,并将wVk留空。 请参阅此处的信息: KEYBDINPUT
3)在发送击键之前,请记住将焦点窗口切换到要发送击键的应用程序。 例:
MemoryHandler.SwitchWindow(Process.GetProcessesByName("notepad").FirstOrDefault().MainWindowHandle);
4)最终代码:
public static void PressKey(char ch, bool press) { byte vk = MemoryApi.VkKeyScan(ch); PressKey((MemoryApi.KeyCode)vk, press); } public static void PressKey(MemoryApi.KeyCode vk, bool press) { ushort scanCode = (ushort)MemoryApi.MapVirtualKey((ushort)vk, 0); //Console.WriteLine("SendInput:: VK: " + (ushort)vk + " (" + vk + ") <-> SC: " + (ushort)(scanCode & 0xff)); if (press) KeyDown(scanCode); else KeyUp(scanCode); } public static void KeyDown(ushort scanCode) { //Console.WriteLine("Key Down (SC): " + (ushort)(scanCode & 0xff)); MemoryApi.INPUT[] inputs = new MemoryApi.INPUT[1]; inputs[0].type = MemoryApi.INPUT_KEYBOARD; inputs[0].ki.wScan = (ushort)(scanCode & 0xff); inputs[0].ki.dwFlags = MemoryApi.KEYEVENTF_SCANCODE; inputs[0].ki.time = 0; inputs[0].ki.dwExtraInfo = IntPtr.Zero; uint intReturn = MemoryApi.SendInput(1, inputs, Marshal.SizeOf(inputs[0])); if (intReturn != 1) { throw new Exception("Could not send key: " + scanCode); } } public static void KeyUp(ushort scanCode) { //Console.WriteLine("Key Up (SC): " + scanCode); MemoryApi.INPUT[] inputs = new MemoryApi.INPUT[1]; inputs[0].type = MemoryApi.INPUT_KEYBOARD; inputs[0].ki.wScan = (ushort)(scanCode & 0xff); inputs[0].ki.dwFlags = MemoryApi.KEYEVENTF_SCANCODE | MemoryApi.KEYEVENTF_KEYUP; inputs[0].ki.time = 0; inputs[0].ki.dwExtraInfo = IntPtr.Zero; uint intReturn = MemoryApi.SendInput(1, inputs, Marshal.SizeOf(inputs[0])); if (intReturn != 1) { throw new Exception("Could not send key: " + scanCode); } }