Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate keyboard events?

short summary:

I am trying to create a program that will send keyboard events to the computer that for all purposes the simulated events should be treated as actual keystrokes on the keyboard.

original post:

I am looking for a way to generate keyboard events using python.

Assume that the function receives a key that it must simulate pressing, like so:

keyboardevent('a') #lower case 'a' keyboardevent('B') #upper case 'B' keyboardevent('->') # right arrow key  def keyboardevent(key):     #code that simulated 'key' being pressed on keyboard 

The above are obviously examples, but what I am looking for is a library, module, or whatever, which I can use to simulate keyboard events.

note: This is different than sending characters to notepads, or inputting text into fields or such. I want the python script to simulate an actual keyboard event, the computer will think that there is really a keyboard event.

Extra Note:

I don't want to send keystrokes to the active window - I want the system to believe the keyboard's keys are being pressed, subtle difference, as some active-windows do not accept certain key-combinations, or if I wanted to use keyboard shortcuts for background processes through my script, they don't need to go through the active-window

So far I have looked at these things:

Generate keyboard events for the frontmost application

How to generate keyboard keypress events through Python?

Which were all about apple and didn't help at all.

And this:

Which is the easiest way to simulate keyboard and mouse on Python?

Which seems like it might be what I need, but I can not find the library for it or any documentation.

I have searched more places as well, but have yet to find a solution.

like image 604
Inbar Rose Avatar asked Nov 26 '12 12:11

Inbar Rose


People also ask

How do I make an event on my keyboard?

The KeyboardEvent. initKeyEvent() method is used to initialize the value of an event created using document. createEvent ("KeyboardEvent") . Events initialized in this way must have been created with the document.

How do you simulate keystrokes?

To simulate native-language keystrokes, you can also use the [Xnn] or [Dnn] constants in the string passed to the Keys method. nn specifies the virtual-key code of the key to be “pressed”. For instance, [X221]u[X221]e will “type” the u and e characters with the circumflex accent.


2 Answers

It can be done using ctypes:

import ctypes from ctypes import wintypes import time  user32 = ctypes.WinDLL('user32', use_last_error=True)  INPUT_MOUSE    = 0 INPUT_KEYBOARD = 1 INPUT_HARDWARE = 2  KEYEVENTF_EXTENDEDKEY = 0x0001 KEYEVENTF_KEYUP       = 0x0002 KEYEVENTF_UNICODE     = 0x0004 KEYEVENTF_SCANCODE    = 0x0008  MAPVK_VK_TO_VSC = 0  # msdn.microsoft.com/en-us/library/dd375731 VK_TAB  = 0x09 VK_MENU = 0x12  # C struct definitions  wintypes.ULONG_PTR = wintypes.WPARAM  class MOUSEINPUT(ctypes.Structure):     _fields_ = (("dx",          wintypes.LONG),                 ("dy",          wintypes.LONG),                 ("mouseData",   wintypes.DWORD),                 ("dwFlags",     wintypes.DWORD),                 ("time",        wintypes.DWORD),                 ("dwExtraInfo", wintypes.ULONG_PTR))  class KEYBDINPUT(ctypes.Structure):     _fields_ = (("wVk",         wintypes.WORD),                 ("wScan",       wintypes.WORD),                 ("dwFlags",     wintypes.DWORD),                 ("time",        wintypes.DWORD),                 ("dwExtraInfo", wintypes.ULONG_PTR))      def __init__(self, *args, **kwds):         super(KEYBDINPUT, self).__init__(*args, **kwds)         # some programs use the scan code even if KEYEVENTF_SCANCODE         # isn't set in dwFflags, so attempt to map the correct code.         if not self.dwFlags & KEYEVENTF_UNICODE:             self.wScan = user32.MapVirtualKeyExW(self.wVk,                                                  MAPVK_VK_TO_VSC, 0)  class HARDWAREINPUT(ctypes.Structure):     _fields_ = (("uMsg",    wintypes.DWORD),                 ("wParamL", wintypes.WORD),                 ("wParamH", wintypes.WORD))  class INPUT(ctypes.Structure):     class _INPUT(ctypes.Union):         _fields_ = (("ki", KEYBDINPUT),                     ("mi", MOUSEINPUT),                     ("hi", HARDWAREINPUT))     _anonymous_ = ("_input",)     _fields_ = (("type",   wintypes.DWORD),                 ("_input", _INPUT))  LPINPUT = ctypes.POINTER(INPUT)  def _check_count(result, func, args):     if result == 0:         raise ctypes.WinError(ctypes.get_last_error())     return args  user32.SendInput.errcheck = _check_count user32.SendInput.argtypes = (wintypes.UINT, # nInputs                              LPINPUT,       # pInputs                              ctypes.c_int)  # cbSize  # Functions  def PressKey(hexKeyCode):     x = INPUT(type=INPUT_KEYBOARD,               ki=KEYBDINPUT(wVk=hexKeyCode))     user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))  def ReleaseKey(hexKeyCode):     x = INPUT(type=INPUT_KEYBOARD,               ki=KEYBDINPUT(wVk=hexKeyCode,                             dwFlags=KEYEVENTF_KEYUP))     user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))  def AltTab():     """Press Alt+Tab and hold Alt key for 2 seconds     in order to see the overlay.     """     PressKey(VK_MENU)   # Alt     PressKey(VK_TAB)    # Tab     ReleaseKey(VK_TAB)  # Tab~     time.sleep(2)     ReleaseKey(VK_MENU) # Alt~  if __name__ == "__main__":     AltTab() 

hexKeyCode is the virtual keyboard mapping as defined by the Windows API. The list of codes is available on MSDN: Virtual-Key Codes (Windows)

like image 174
lucasg Avatar answered Sep 29 '22 01:09

lucasg


For both python3 and python2 you can use pyautogui (pip install pyautogui)

from pyautogui import press, typewrite, hotkey  press('a') typewrite('quick brown fox') hotkey('ctrl', 'w') 

It's also crossplatform with Windows, OSX, and Ubuntu LTS.

like image 43
CornSmith Avatar answered Sep 29 '22 03:09

CornSmith