Example #1
0
// 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;
        }
Example #2
0
 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;
 }
Example #3
0
 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);
Example #4
0
 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);
 }
Example #5
0
 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);
 }
Example #6
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;
            }
        }