// ReSharper restore InconsistentNaming public KeyStroke Read() { KEYBOARD_INPUT_DATA outBuffer = new KEYBOARD_INPUT_DATA(); uint bytesReturned = 0; uint outBufferSize = (uint) Marshal.SizeOf(typeof(KEYBOARD_INPUT_DATA)); RawRead(base.device, 0x222100, IntPtr.Zero, 0, out outBuffer, outBufferSize, out bytesReturned, IntPtr.Zero); if (bytesReturned > 0) { var keyStroke = new KeyStroke(); keyStroke.code = outBuffer.MakeCode; keyStroke.state = (States) outBuffer.Flags; keyStroke.information = outBuffer.ExtraInformation; return keyStroke; } return null; }
public uint Read(KeyStroke[] keyStrokes, int number) { if ((number <= 0) || (keyStrokes.Length < number)) { return 0; } KEYBOARD_INPUT_DATA[] outBuffer = new KEYBOARD_INPUT_DATA[number]; uint bytesReturned = 0; uint num2 = (uint) Marshal.SizeOf(typeof(KEYBOARD_INPUT_DATA)); RawRead(base.device, 0x222100, IntPtr.Zero, 0, outBuffer, (uint) (number * num2), out bytesReturned, IntPtr.Zero); bytesReturned /= num2; for (int i = 0; i < bytesReturned; i++) { keyStrokes[i].code = outBuffer[i].MakeCode; keyStrokes[i].state = (States) outBuffer[i].Flags; keyStrokes[i].information = outBuffer[i].ExtraInformation; } return bytesReturned; }
private static extern bool RawWrite(SafeFileHandle Device, uint IoControlCode, ref KEYBOARD_INPUT_DATA InBuffer, uint InBufferSize, IntPtr OutBuffer, uint OutBufferSize, out uint BytesReturned, IntPtr Overlapped);
public uint Write(KeyStroke[] keyStrokes, int number) { if ((number <= 0) || (keyStrokes.Length < number)) { return 0; } KEYBOARD_INPUT_DATA[] inBuffer = new KEYBOARD_INPUT_DATA[number]; uint bytesReturned = 0; uint num2 = (uint) Marshal.SizeOf(typeof(KEYBOARD_INPUT_DATA)); for (int i = 0; i < number; i++) { inBuffer[i].UnitId = 0; inBuffer[i].MakeCode = keyStrokes[i].code; inBuffer[i].Flags = (ushort) keyStrokes[i].state; inBuffer[i].Reserved = 0; inBuffer[i].ExtraInformation = keyStrokes[i].information; } RawWrite(base.device, 0x222080, inBuffer, (uint) (number * num2), IntPtr.Zero, 0, out bytesReturned, IntPtr.Zero); return (bytesReturned / num2); }
public bool Write(KeyStroke keyStroke) { KEYBOARD_INPUT_DATA inBuffer = new KEYBOARD_INPUT_DATA(); uint bytesReturned = 0; uint inBufferSize = (uint) Marshal.SizeOf(typeof(KEYBOARD_INPUT_DATA)); inBuffer.UnitId = 0; inBuffer.MakeCode = keyStroke.code; inBuffer.Flags = (ushort) keyStroke.state; inBuffer.Reserved = 0; inBuffer.ExtraInformation = keyStroke.information; RawWrite(base.device, 0x222080, ref inBuffer, inBufferSize, IntPtr.Zero, 0, out bytesReturned, IntPtr.Zero); return (bytesReturned > 0); }
static void Main(string[] args) { if (args.Length == 0) { PrintUsage(); return; } Command command; switch (args[0].ToLower()) { case "reset": command = Command.Reset; break; case "detect": command = Command.Detect; break; case "filter": command = Command.SetFilter; break; case "modify": command = Command.SetModify; break; case "show": command = Command.Show; break; case "activate": command = Command.SetActive; break; case "insert": command = Command.InsertKeys; break; case "attribs": command = Command.GetAttributes; break; default: PrintUsage(); return; } ushort deviceId; switch (command) { case Command.Detect: Console.WriteLine("Getting devices Id of your keyboard. Please press any key."); deviceId = KeyboardEmulatorAPI.Instance.KeyboardDetectDeviceId(); Console.WriteLine($"Device Id is {deviceId}"); PrintKeyboardDevices(); break; case Command.Reset: KeyboardEmulatorAPI.Instance.KeyboardSetFiltering(new KeyFiltering() { FilterMode = FilterMode.KEY_NONE }); KeyboardEmulatorAPI.Instance.KeyboardSetModification(new KeyModification { ModifyCount = 0 }); Console.WriteLine("Key filterings and modifications cleared for the active device."); break; case Command.SetActive: if (!ushort.TryParse(args[1], out deviceId)) { Console.WriteLine($"Usage: \n {GetExeName()} active <deviceId>"); return; } Console.WriteLine($"Setting device Id to {deviceId}"); KeyboardEmulatorAPI.Instance.KeyboardSetActiveDevice(deviceId); PrintKeyboardDevices(); break; case Command.SetFilter: if (args.Length < 2) { PrintFilterUsage(); return; } var scanCodes = new List <ushort>(); if (args[1].ToLower() == "add" || args[1].ToLower() == "remove") { if (args.Length < 3 || !ushort.TryParse(args[2], out ushort scanCode)) { PrintFilterUsage(); return; } if (args[1].ToLower() == "add") { KeyboardEmulatorAPI.Instance.KeyboardAddKeyFiltering(new KeyFilterData() { KeyFlagPredicates = KeyboardKeyFlag.KEY_PRESS, ScanCode = scanCode }); Console.WriteLine("Key filter added."); PrintKeyFilterings(); } else { KeyboardEmulatorAPI.Instance.KeyboardRemoveKeyFiltering(new KeyFilterData() { KeyFlagPredicates = KeyboardKeyFlag.KEY_PRESS, ScanCode = scanCode }); Console.WriteLine("Key filter removed."); PrintKeyFilterings(); } } else { for (int i = 1; i < args.Length; i++) { if (!ushort.TryParse(args[i], out ushort scanCode)) { PrintFilterUsage(); return; } scanCodes.Add(scanCode); } KeyFiltering filterRequest = new KeyFiltering(); filterRequest.FilterMode = FilterMode.KEY_FLAG_AND_SCANCODE; filterRequest.FlagOrCount = (ushort)scanCodes.Count; filterRequest.FilterData = new KeyFilterData[scanCodes.Count]; for (int i = 0; i < scanCodes.Count; i++) { filterRequest.FilterData[i].KeyFlagPredicates = KeyboardKeyFlag.KEY_PRESS; filterRequest.FilterData[i].ScanCode = scanCodes[i]; } KeyboardEmulatorAPI.Instance.KeyboardSetFiltering(filterRequest); Console.WriteLine("Filters set."); PrintKeyFilterings(); } break; case Command.SetModify: if (args.Length < 2) { PrintModifyUsage(); return; } if (args[1].ToLower() == "add" || args[1].ToLower() == "remove") { if (args.Length < 3) { PrintModifyUsage(); return; } string[] parts = args[2].Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length != 2 || !ushort.TryParse(parts[0], out ushort fromScanCode) || !ushort.TryParse(parts[1], out ushort toScanCode)) { PrintModifyUsage(); return; } if (args[1].ToLower() == "add") { KeyboardEmulatorAPI.Instance.KeyboardAddKeyModifying(new KeyModifyData() { KeyStatePredicates = KeyboardKeyFlag.KEY_PRESS, FromScanCode = fromScanCode, ToScanCode = toScanCode }); Console.WriteLine("Key modification added."); PrintKeyModifications(); } else { KeyboardEmulatorAPI.Instance.KeyboardRemoveKeyModifying(new KeyModifyData() { KeyStatePredicates = KeyboardKeyFlag.KEY_PRESS, FromScanCode = fromScanCode, ToScanCode = toScanCode }); Console.WriteLine("Key modification removed."); PrintKeyModifications(); } } else { var scanCodePairs = new List <Tuple <ushort, ushort> >(); for (int i = 1; i < args.Length; i++) { string[] parts = args[i].Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length != 2 || !ushort.TryParse(parts[0], out ushort fromScanCode) || !ushort.TryParse(parts[1], out ushort toScanCode)) { PrintModifyUsage(); return; } scanCodePairs.Add(new Tuple <ushort, ushort>(fromScanCode, toScanCode)); } KeyModification modifyRequest = new KeyModification(); modifyRequest.ModifyCount = (ushort)scanCodePairs.Count; modifyRequest.ModifyData = new KeyModifyData[scanCodePairs.Count]; for (int i = 0; i < scanCodePairs.Count; i++) { modifyRequest.ModifyData[i].KeyStatePredicates = KeyboardKeyFlag.KEY_PRESS; modifyRequest.ModifyData[i].FromScanCode = scanCodePairs[i].Item1; modifyRequest.ModifyData[i].ToScanCode = scanCodePairs[i].Item2; } KeyboardEmulatorAPI.Instance.KeyboardSetModification(modifyRequest); Console.WriteLine("Key modifications set."); PrintKeyModifications(); } break; case Command.InsertKeys: if (args.Length < 2) { PrintInsertKeyUsage(); return; } List <ushort> insertScanCodes = new List <ushort>(); int delay = 0; int startIndex = 1; if (args[1].ToLower() == "delay") { if (args.Length < 4 || !int.TryParse(args[2], out delay)) { PrintInsertKeyUsage(); return; } startIndex = 3; } for (int i = startIndex; i < args.Length; i++) { if (!ushort.TryParse(args[i], out ushort scanCode)) { PrintInsertKeyUsage(); return; } insertScanCodes.Add(scanCode); } if (delay > 0) { Task.Delay(delay).Wait(); } KEYBOARD_INPUT_DATA[] inputs = new KEYBOARD_INPUT_DATA[insertScanCodes.Count * 2]; for (int i = 0; i < insertScanCodes.Count; i++) { inputs[i * 2].Flags = KeyboardKeyState.KEY_DOWN; inputs[i * 2].MakeCode = insertScanCodes[i]; inputs[i * 2 + 1].Flags = KeyboardKeyState.KEY_UP; inputs[i * 2 + 1].MakeCode = insertScanCodes[i]; } KeyboardEmulatorAPI.Instance.KeyboardInsertKeys(inputs); break; case Command.Show: PrintKeyboardDevices(); PrintKeyFilterings(); PrintKeyModifications(); break; case Command.GetAttributes: PrintKeyboardAttribs(); break; default: PrintUsage(); break; } }