private void CreateInputEvent(NativeMethods.INPUT_RECORD record, out InputEvent inputEvent) { inputEvent = new InputEvent(); switch (record.EventType) { case NativeMethods.MOUSE_EVENT: inputEvent.InputType = InputEventType.Mouse; inputEvent.MouseInput = new MouseInputEvent( record.MouseEvent.dwMousePosition.X, record.MouseEvent.dwMousePosition.Y, record.MouseEvent.dwButtonState, record.MouseEvent.dwControlKeyState, record.MouseEvent.dwEventFlags ); break; case NativeMethods.KEY_EVENT: inputEvent.InputType = InputEventType.Keyboard; inputEvent.KeyboardInput = new KeyboardInputEvent( record.KeyEvent.wVirtualKeyCode, record.KeyEvent.UnicodeChar, record.KeyEvent.dwControlKeyState, record.KeyEvent.wRepeatCount, record.KeyEvent.bKeyDown ); break; } }
public InputEvent GetInput() { var record = new NativeMethods.INPUT_RECORD(); uint recordLen = 0; InputEvent inputEvent; if (!(NativeMethods.ReadConsoleInput(_handler, ref record, 1, ref recordLen))) { throw new Win32Exception(); } CreateInputEvent(record, out inputEvent); return(inputEvent); }
public static void Run() { // Merci StackOverflow. runProcess = true; var handle = NativeMethods.GetStdHandle(NativeMethods.STD_INPUT_HANDLE); int mode = 0; if (!(NativeMethods.GetConsoleMode(handle, ref mode))) { throw new Win32Exception(); } mode |= NativeMethods.ENABLE_MOUSE_INPUT; mode &= ~NativeMethods.ENABLE_QUICK_EDIT_MODE; mode |= NativeMethods.ENABLE_EXTENDED_FLAGS; if (!(NativeMethods.SetConsoleMode(handle, mode))) { throw new Win32Exception(); } var record = new NativeMethods.INPUT_RECORD(); uint recordLen = 0; while (runProcess) { while (isNotDrawing) { if (!(NativeMethods.ReadConsoleInput(handle, ref record, 1, ref recordLen))) { throw new Win32Exception(); } switch (record.EventType) { case NativeMethods.MOUSE_EVENT: { isMouseHeld = record.MouseEvent.dwButtonState; col = record.MouseEvent.dwMousePosition.X; row = record.MouseEvent.dwMousePosition.Y; } break; } } } }
public InputEvent MaybeGetInput() { UInt32 events = 0; NativeMethods.GetNumberOfConsoleInputEvents(_handler, out events); InputEvent inputEvent = new InputEvent(); if (events > 0) { var record = new NativeMethods.INPUT_RECORD(); uint recordLen = 0; if (!(NativeMethods.ReadConsoleInput(_handler, ref record, 1, ref recordLen))) { throw new Win32Exception(); } CreateInputEvent(record, out inputEvent); } return(inputEvent); }
static public void MouseThread() { var handle = NativeMethods.GetStdHandle(NativeMethods.STD_INPUT_HANDLE); int mode = 0; if (!(NativeMethods.GetConsoleMode(handle, ref mode))) { throw new Win32Exception(); } mode |= NativeMethods.ENABLE_MOUSE_INPUT; mode &= ~NativeMethods.ENABLE_QUICK_EDIT_MODE; mode |= NativeMethods.ENABLE_EXTENDED_FLAGS; if (!(NativeMethods.SetConsoleMode(handle, mode))) { throw new Win32Exception(); } var record = new NativeMethods.INPUT_RECORD(); uint recordLen = 0; while (true) { if (!(NativeMethods.ReadConsoleInput(handle, ref record, 1, ref recordLen))) { throw new Win32Exception(); } switch (record.EventType) { case NativeMethods.MOUSE_EVENT: { Mouse._Pressed = Mouse.Pressed; if (record.MouseEvent.dwButtonState == 0x001) { Mouse.Pressed = true; } else { Mouse.Pressed = false; } Mouse.Pos(record.MouseEvent.dwMousePosition.X, record.MouseEvent.dwMousePosition.Y); //Console.WriteLine(string.Format(" X ...............: {0,4:0} ", record.MouseEvent.dwMousePosition.X)); //Console.WriteLine(string.Format(" Y ...............: {0,4:0} ", record.MouseEvent.dwMousePosition.Y)); //Console.WriteLine(string.Format(" dwButtonState ...: 0x{0:X4} ", record.MouseEvent.dwButtonState)); //Console.WriteLine(string.Format(" dwControlKeyState: 0x{0:X4} ", record.MouseEvent.dwControlKeyState)); //Console.WriteLine(string.Format(" dwEventFlags ....: 0x{0:X4} ", record.MouseEvent.dwEventFlags)); } break; } if (Mouse.Pressed == true && Mouse._Pressed == false) { Mouse.Clicked = true; } else { Mouse.Clicked = false; } } }
/// <summary> /// Determines if a key has been pressed on the keyboard. /// </summary> /// The key can be read using the ReadKey function. /// <remarks> /// </remarks> /// <returns>True If key has been pressed False If key has not been pressed</returns> public static bool KeyPressed() { lock (_Lock) { // Check if we have a key in the buffer already if (_KeyBuf.Count > 0) return true; uint NumberOfEvents = 0; do { if (OSUtils.IsWindows) { NativeMethods.GetNumberOfConsoleInputEvents(_StdInputHandle, out NumberOfEvents); if (NumberOfEvents > 0) { NativeMethods.INPUT_RECORD[] Buffer = new NativeMethods.INPUT_RECORD[1]; uint NumberOfEventsRead = 0; if (NativeMethods.ReadConsoleInput(_StdInputHandle, Buffer, 1, out NumberOfEventsRead)) { if ((Buffer[0].EventType == NativeMethods.KEY_EVENT) && (Buffer[0].KeyEvent.bKeyDown)) { bool Alt = (NativeMethods.GetKeyState(NativeMethods.VirtualKeyStates.VK_MENU) & 0x8000) == 0x8000; bool Ctrl = (NativeMethods.GetKeyState(NativeMethods.VirtualKeyStates.VK_CONTROL) & 0x8000) == 0x8000; bool Shift = (NativeMethods.GetKeyState(NativeMethods.VirtualKeyStates.VK_SHIFT) & 0x8000) == 0x8000; if ((Buffer[0].KeyEvent.wVirtualKeyCode >= 65) && (Buffer[0].KeyEvent.wVirtualKeyCode <= 90)) { bool CapsLock = (NativeMethods.GetKeyState(NativeMethods.VirtualKeyStates.VK_CAPITAL) & 0x0001) == 0x0001; Shift ^= CapsLock; } if ((Buffer[0].KeyEvent.wVirtualKeyCode >= 96) && (Buffer[0].KeyEvent.wVirtualKeyCode <= 105)) { bool NumLock = (NativeMethods.GetKeyState(NativeMethods.VirtualKeyStates.VK_NUMLOCK) & 0x0001) == 0x0001; Shift |= NumLock; } int Key = 0; if (Alt) { Key = TAltKeys[Buffer[0].KeyEvent.wVirtualKeyCode]; } else if (Ctrl) { Key = TCtrlKeys[Buffer[0].KeyEvent.wVirtualKeyCode]; } else if (Shift) { Key = TShiftKeys[Buffer[0].KeyEvent.wVirtualKeyCode]; } else { Key = TKeys[Buffer[0].KeyEvent.wVirtualKeyCode]; } if (Key >= 1000) { _KeyBuf.Enqueue((char)0); _KeyBuf.Enqueue((char)(Key - 1000)); } else if (Key > 0) { _KeyBuf.Enqueue((char)Key); } } } } } else { try { NumberOfEvents = (uint)(Console.KeyAvailable ? 1 : 0); if (NumberOfEvents > 0) { ConsoleKeyInfo CKI = Console.ReadKey(true); bool Alt = (CKI.Modifiers & ConsoleModifiers.Alt) == ConsoleModifiers.Alt; bool Ctrl = (CKI.Modifiers & ConsoleModifiers.Control) == ConsoleModifiers.Control; bool Shift = (CKI.Modifiers & ConsoleModifiers.Shift) == ConsoleModifiers.Shift; if (((int)CKI.Key >= 65) && ((int)CKI.Key <= 90)) { try { Shift ^= Console.CapsLock; } catch (NotSupportedException) { // Looks like mono doesn't support this } } if (((int)CKI.Key >= 96) && ((int)CKI.Key <= 105)) { Shift |= Console.NumberLock; } int Key = 0; if (Alt) { Key = TAltKeys[(int)CKI.Key]; } else if (Ctrl) { Key = TCtrlKeys[(int)CKI.Key]; } else if (Shift) { Key = TShiftKeys[(int)CKI.Key]; } else { Key = TKeys[(int)CKI.Key]; } if (Key >= 1000) { _KeyBuf.Enqueue((char)0); _KeyBuf.Enqueue((char)(Key - 1000)); } else if (Key > 0) { _KeyBuf.Enqueue((char)Key); } } } catch (NotImplementedException) { // Can't do that NumberOfEvents = 0; } } } while (NumberOfEvents > 0); return false; } }