Hook and simulate global keyboard events on Windows and Linux.

Overview

keyboard

Take full control of your keyboard with this small Python library. Hook global events, register hotkeys, simulate key presses and much more.

Features

  • Global event hook on all keyboards (captures keys regardless of focus).
  • Listen and send keyboard events.
  • Works with Windows and Linux (requires sudo), with experimental OS X support (thanks @glitchassassin!).
  • Pure Python, no C modules to be compiled.
  • Zero dependencies. Trivial to install and deploy, just copy the files.
  • Python 2 and 3.
  • Complex hotkey support (e.g. ctrl+shift+m, ctrl+space) with controllable timeout.
  • Includes high level API (e.g. record and play, add_abbreviation).
  • Maps keys as they actually are in your layout, with full internationalization support (e.g. Ctrl+ç).
  • Events automatically captured in separate thread, doesn't block main program.
  • Tested and documented.
  • Doesn't break accented dead keys (I'm looking at you, pyHook).
  • Mouse support available via project mouse (pip install mouse).

Usage

Install the PyPI package:

pip install keyboard

or clone the repository (no installation required, source files are sufficient):

git clone https://github.com/boppreh/keyboard

or download and extract the zip into your project folder.

Then check the API docs below to see what features are available.

Example

import keyboard

keyboard.press_and_release('shift+s, space')

keyboard.write('The quick brown fox jumps over the lazy dog.')

keyboard.add_hotkey('ctrl+shift+a', print, args=('triggered', 'hotkey'))

# Press PAGE UP then PAGE DOWN to type "foobar".
keyboard.add_hotkey('page up, page down', lambda: keyboard.write('foobar'))

# Blocks until you press esc.
keyboard.wait('esc')

# Record events until 'esc' is pressed.
recorded = keyboard.record(until='esc')
# Then replay back at three times the speed.
keyboard.play(recorded, speed_factor=3)

# Type @@ then press space to replace with abbreviation.
keyboard.add_abbreviation('@@', '[email protected]')

# Block forever, like `while True`.
keyboard.wait()

Known limitations:

  • Events generated under Windows don't report device id (event.device == None). #21
  • Media keys on Linux may appear nameless (scan-code only) or not at all. #20
  • Key suppression/blocking only available on Windows. #22
  • To avoid depending on X, the Linux parts reads raw device files (/dev/input/input*) but this requires root.
  • Other applications, such as some games, may register hooks that swallow all key events. In this case keyboard will be unable to report events.
  • This program makes no attempt to hide itself, so don't use it for keyloggers or online gaming bots. Be responsible.

API

Table of Contents

keyboard.KEY_DOWN

= 'down'

keyboard.KEY_UP

= 'up'

class keyboard.KeyboardEvent

KeyboardEvent.device

KeyboardEvent.event_type

KeyboardEvent.is_keypad

KeyboardEvent.modifiers

KeyboardEvent.name

KeyboardEvent.scan_code

KeyboardEvent.time

KeyboardEvent.to_json(self, ensure_ascii=False)

[source]

keyboard.all_modifiers

= {'alt', 'alt gr', 'ctrl', 'left alt', 'left ctrl', 'left shift', 'left windows', 'right alt', 'right ctrl', 'right shift', 'right windows', 'shift', 'windows'}

keyboard.sided_modifiers

= {'alt', 'ctrl', 'shift', 'windows'}

keyboard.version

= '0.13.5'

keyboard.is_modifier(key)

[source]

Returns True if key is a scan code or name of a modifier key.

keyboard.key_to_scan_codes(key, error_if_missing=True)

[source]

Returns a list of scan codes associated with this key (name or scan code).

keyboard.parse_hotkey(hotkey)

[source]

Parses a user-provided hotkey into nested tuples representing the parsed structure, with the bottom values being lists of scan codes. Also accepts raw scan codes, which are then wrapped in the required number of nestings.

Example:

parse_hotkey("alt+shift+a, alt+b, c")
#    Keys:    ^~^ ^~~~^ ^  ^~^ ^  ^
#    Steps:   ^~~~~~~~~~^  ^~~~^  ^

# ((alt_codes, shift_codes, a_codes), (alt_codes, b_codes), (c_codes,))

keyboard.send(hotkey, do_press=True, do_release=True)

[source]

Sends OS events that perform the given hotkey hotkey.

  • hotkey can be either a scan code (e.g. 57 for space), single key (e.g. 'space') or multi-key, multi-step hotkey (e.g. 'alt+F4, enter').
  • do_press if true then press events are sent. Defaults to True.
  • do_release if true then release events are sent. Defaults to True.
send(57)
send('ctrl+alt+del')
send('alt+F4, enter')
send('shift+s')

Note: keys are released in the opposite order they were pressed.

keyboard.press(hotkey)

[source]

Presses and holds down a hotkey (see send).

keyboard.release(hotkey)

[source]

Releases a hotkey (see send).

keyboard.is_pressed(hotkey)

[source]

Returns True if the key is pressed.

is_pressed(57) #-> True
is_pressed('space') #-> True
is_pressed('ctrl+space') #-> True

keyboard.call_later(fn, args=(), delay=0.001)

[source]

Calls the provided function in a new thread after waiting some time. Useful for giving the system some time to process an event, without blocking the current execution flow.

keyboard.hook(callback, suppress=False, on_remove=<lambda>)

[source]

Installs a global listener on all available keyboards, invoking callback each time a key is pressed or released.

The event passed to the callback is of type keyboard.KeyboardEvent, with the following attributes:

  • name: an Unicode representation of the character (e.g. "&") or description (e.g. "space"). The name is always lower-case.
  • scan_code: number representing the physical key, e.g. 55.
  • time: timestamp of the time the event occurred, with as much precision as given by the OS.

Returns the given callback for easier development.

keyboard.on_press(callback, suppress=False)

[source]

Invokes callback for every KEY_DOWN event. For details see hook.

keyboard.on_release(callback, suppress=False)

[source]

Invokes callback for every KEY_UP event. For details see hook.

keyboard.hook_key(key, callback, suppress=False)

[source]

Hooks key up and key down events for a single key. Returns the event handler created. To remove a hooked key use unhook_key(key) or unhook_key(handler).

Note: this function shares state with hotkeys, so clear_all_hotkeys affects it as well.

keyboard.on_press_key(key, callback, suppress=False)

[source]

Invokes callback for KEY_DOWN event related to the given key. For details see hook.

keyboard.on_release_key(key, callback, suppress=False)

[source]

Invokes callback for KEY_UP event related to the given key. For details see hook.

keyboard.unhook(remove)

[source]

Removes a previously added hook, either by callback or by the return value of hook.

keyboard.unhook_all()

[source]

Removes all keyboard hooks in use, including hotkeys, abbreviations, word listeners, recorders and waits.

keyboard.block_key(key)

[source]

Suppresses all key events of the given key, regardless of modifiers.

keyboard.remap_key(src, dst)

[source]

Whenever the key src is pressed or released, regardless of modifiers, press or release the hotkey dst instead.

keyboard.parse_hotkey_combinations(hotkey)

[source]

Parses a user-provided hotkey. Differently from parse_hotkey, instead of each step being a list of the different scan codes for each key, each step is a list of all possible combinations of those scan codes.

keyboard.add_hotkey(hotkey, callback, args=(), suppress=False, timeout=1, trigger_on_release=False)

[source]

Invokes a callback every time a hotkey is pressed. The hotkey must be in the format ctrl+shift+a, s. This would trigger when the user holds ctrl, shift and "a" at once, releases, and then presses "s". To represent literal commas, pluses, and spaces, use their names ('comma', 'plus', 'space').

  • args is an optional list of arguments to passed to the callback during each invocation.
  • suppress defines if successful triggers should block the keys from being sent to other programs.
  • timeout is the amount of seconds allowed to pass between key presses.
  • trigger_on_release if true, the callback is invoked on key release instead of key press.

The event handler function is returned. To remove a hotkey call remove_hotkey(hotkey) or remove_hotkey(handler). before the hotkey state is reset.

Note: hotkeys are activated when the last key is pressed, not released. Note: the callback is executed in a separate thread, asynchronously. For an example of how to use a callback synchronously, see wait.

Examples:

# Different but equivalent ways to listen for a spacebar key press.
add_hotkey(' ', print, args=['space was pressed'])
add_hotkey('space', print, args=['space was pressed'])
add_hotkey('Space', print, args=['space was pressed'])
# Here 57 represents the keyboard code for spacebar; so you will be
# pressing 'spacebar', not '57' to activate the print function.
add_hotkey(57, print, args=['space was pressed'])

add_hotkey('ctrl+q', quit)
add_hotkey('ctrl+alt+enter, space', some_callback)

keyboard.remove_hotkey(hotkey_or_callback)

[source]

Removes a previously hooked hotkey. Must be called with the value returned by add_hotkey.

keyboard.unhook_all_hotkeys()

[source]

Removes all keyboard hotkeys in use, including abbreviations, word listeners, recorders and waits.

keyboard.remap_hotkey(src, dst, suppress=True, trigger_on_release=False)

[source]

Whenever the hotkey src is pressed, suppress it and send dst instead.

Example:

remap_hotkey('alt+w', 'ctrl+up')

keyboard.stash_state()

[source]

Builds a list of all currently pressed scan codes, releases them and returns the list. Pairs well with restore_state and restore_modifiers.

keyboard.restore_state(scan_codes)

[source]

Given a list of scan_codes ensures these keys, and only these keys, are pressed. Pairs well with stash_state, alternative to restore_modifiers.

keyboard.restore_modifiers(scan_codes)

[source]

Like restore_state, but only restores modifier keys.

keyboard.write(text, delay=0, restore_state_after=True, exact=None)

[source]

Sends artificial keyboard events to the OS, simulating the typing of a given text. Characters not available on the keyboard are typed as explicit unicode characters using OS-specific functionality, such as alt+codepoint.

To ensure text integrity, all currently pressed keys are released before the text is typed, and modifiers are restored afterwards.

  • delay is the number of seconds to wait between keypresses, defaults to no delay.
  • restore_state_after can be used to restore the state of pressed keys after the text is typed, i.e. presses the keys that were released at the beginning. Defaults to True.
  • exact forces typing all characters as explicit unicode (e.g. alt+codepoint or special events). If None, uses platform-specific suggested value.

keyboard.wait(hotkey=None, suppress=False, trigger_on_release=False)

[source]

Blocks the program execution until the given hotkey is pressed or, if given no parameters, blocks forever.

keyboard.get_hotkey_name(names=None)

[source]

Returns a string representation of hotkey from the given key names, or the currently pressed keys if not given. This function:

  • normalizes names;
  • removes "left" and "right" prefixes;
  • replaces the "+" key name with "plus" to avoid ambiguity;
  • puts modifier keys first, in a standardized order;
  • sort remaining keys;
  • finally, joins everything with "+".

Example:

get_hotkey_name(['+', 'left ctrl', 'shift'])
# "ctrl+shift+plus"

keyboard.read_event(suppress=False)

[source]

Blocks until a keyboard event happens, then returns that event.

keyboard.read_key(suppress=False)

[source]

Blocks until a keyboard event happens, then returns that event's name or, if missing, its scan code.

keyboard.read_hotkey(suppress=True)

[source]

Similar to read_key(), but blocks until the user presses and releases a hotkey (or single key), then returns a string representing the hotkey pressed.

Example:

read_hotkey()
# "ctrl+shift+p"

keyboard.get_typed_strings(events, allow_backspace=True)

[source]

Given a sequence of events, tries to deduce what strings were typed. Strings are separated when a non-textual key is pressed (such as tab or enter). Characters are converted to uppercase according to shift and capslock status. If allow_backspace is True, backspaces remove the last character typed.

This function is a generator, so you can pass an infinite stream of events and convert them to strings in real time.

Note this functions is merely an heuristic. Windows for example keeps per- process keyboard state such as keyboard layout, and this information is not available for our hooks.

get_type_strings(record()) #-> ['This is what', 'I recorded', '']

keyboard.start_recording(recorded_events_queue=None)

[source]

Starts recording all keyboard events into a global variable, or the given queue if any. Returns the queue of events and the hooked function.

Use stop_recording() or unhook(hooked_function) to stop.

keyboard.stop_recording()

[source]

Stops the global recording of events and returns a list of the events captured.

keyboard.record(until='escape', suppress=False, trigger_on_release=False)

[source]

Records all keyboard events from all keyboards until the user presses the given hotkey. Then returns the list of events recorded, of type keyboard.KeyboardEvent. Pairs well with play(events).

Note: this is a blocking function. Note: for more details on the keyboard hook and events see hook.

keyboard.play(events, speed_factor=1.0)

[source]

Plays a sequence of recorded events, maintaining the relative time intervals. If speed_factor is <= 0 then the actions are replayed as fast as the OS allows. Pairs well with record().

Note: the current keyboard state is cleared at the beginning and restored at the end of the function.

keyboard.add_word_listener(word, callback, triggers=['space'], match_suffix=False, timeout=2)

[source]

Invokes a callback every time a sequence of characters is typed (e.g. 'pet') and followed by a trigger key (e.g. space). Modifiers (e.g. alt, ctrl, shift) are ignored.

  • word the typed text to be matched. E.g. 'pet'.
  • callback is an argument-less function to be invoked each time the word is typed.
  • triggers is the list of keys that will cause a match to be checked. If the user presses some key that is not a character (len>1) and not in triggers, the characters so far will be discarded. By default the trigger is only space.
  • match_suffix defines if endings of words should also be checked instead of only whole words. E.g. if true, typing 'carpet'+space will trigger the listener for 'pet'. Defaults to false, only whole words are checked.
  • timeout is the maximum number of seconds between typed characters before the current word is discarded. Defaults to 2 seconds.

Returns the event handler created. To remove a word listener use remove_word_listener(word) or remove_word_listener(handler).

Note: all actions are performed on key down. Key up events are ignored. Note: word matches are case sensitive.

keyboard.remove_word_listener(word_or_handler)

[source]

Removes a previously registered word listener. Accepts either the word used during registration (exact string) or the event handler returned by the add_word_listener or add_abbreviation functions.

keyboard.add_abbreviation(source_text, replacement_text, match_suffix=False, timeout=2)

[source]

Registers a hotkey that replaces one typed text with another. For example

add_abbreviation('tm', u'™')

Replaces every "tm" followed by a space with a ™ symbol (and no space). The replacement is done by sending backspace events.

  • match_suffix defines if endings of words should also be checked instead of only whole words. E.g. if true, typing 'carpet'+space will trigger the listener for 'pet'. Defaults to false, only whole words are checked.
  • timeout is the maximum number of seconds between typed characters before the current word is discarded. Defaults to 2 seconds.

For more details see add_word_listener.

keyboard.normalize_name(name)

[source]

Given a key name (e.g. "LEFT CONTROL"), clean up the string and convert to the canonical representation (e.g. "left ctrl") if one is known.

Comments
  • Windows support

    Windows support

    Hi,

    This pure-python, cross-platform lib is quite impressive. It could help a lot on workstations where adding stuff is severely restricted (ie no pip, etc.).

    One thing I'm looking for is to reproduce (at least partly) the abbreviation expansion functionality found in Autohotkey (among others). This replaces text patterns as you type, without hotkeys (ie., type 'tm" followed by space and its gets replaced by a trademark symbol for example).

    I have not been able to do this using the add_hotkey method (which is probably normal). Could there be a way to achieve it using the lower-level functions ?

    TIA, fp

    opened by fpp-gh 68
  • Key mapping error on non-English Windows

    Key mapping error on non-English Windows

    Using Python2.7(32bits) on W10(64bits).

    The following is ok : keyboard.press('s')

    The following raises an exception : keyboard.press('shift+s')

    File "Z:\Eclipse\GamepadToKey\src\key_manager.py", line 25, in joy_set_button keyboard.press(buttons_tab[button]) File "Z:\Eclipse\GamepadToKey\src\keyboard_init.py", line 509, in press send(combination, True, False) File "Z:\Eclipse\GamepadToKey\src\keyboard_init_.py", line 501, in send os_keyboard.press(to_scan_code(key)) File "Z:\Eclipse\GamepadToKey\src\keyboard_init.py", line 479, in to_scan_code scan_code, modifiers = _os_keyboard.map_char(_normalize_name(key)) File "Z:\Eclipse\GamepadToKey\src\keyboard_winkeyboard.py", line 244, in map_char raise ValueError('Character {} is not mapped to any known key.'.format(repr(character))) ValueError: Character 'shift' is not mapped to any known key.

    Bug or Windows limitation ?

    opened by NicoPy 29
  • keyboard.wait() causes an error since the last package update

    keyboard.wait() causes an error since the last package update

    Exception in thread Thread-1:
    Traceback (most recent call last):
      File "C:\Users\rbedard\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 916, in _bootstrap_inner
        self.run()
      File "C:\Users\rbedard\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 864, in run
        self._target(*self._args, **self._kwargs)
      File "C:\Users\rbedard\AppData\Local\Programs\Python\Python36-32\lib\site-packages\keyboard\__init__.py", line 138, in listen
        _os_keyboard.listen(self.queue, _key_table.is_allowed)
      File "C:\Users\rbedard\AppData\Local\Programs\Python\Python36-32\lib\site-packages\keyboard\_winkeyboard.py", line 470, in listen
        prepare_intercept(lambda e: queue.put(e) or is_allowed(e.name, e.event_type == KEY_UP))
      File "C:\Users\rbedard\AppData\Local\Programs\Python\Python36-32\lib\site-packages\keyboard\_winkeyboard.py", line 451, in prepare_intercept
        keyboard_hook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboard_callback, NULL, NULL)
    ctypes.ArgumentError: argument 2: <class 'TypeError'>: expected CFunctionType instance instead of CFunctionType
    

    I'm doing the following and I get the above exception when I hit the keyboard.wait line. I did not have a chance to dig in to figure out what was happening so I'm hoping someone can get to this before I am able to. This was working fine before I updated the keyboard package today.

    recorded = []
    keyboard.hook(recorded.append)
    mouse.hook(recorded.append)
    keyboard.wait('esc')
    
    opened by bobonthenet 21
  • nothing happens

    nothing happens

    hi, i am python newbie, and is very dificult to me understand how to run this program, so, i create a executable file on linux called k3y like this

    #!/usr/bin/python
    # coding: latin-1
    
    import keyboard
    
    # Press PAGE UP then PAGE DOWN to type "foobar".
    keyboard.add_hotkey('page up, page down', lambda: keyboard.write('foobar'))
    
    keyboard.add_hotkey('ctrl+q', quit)
    keyboard.add_hotkey('ctrl+alt+enter, space', u'some_callback')
    keyboard.add_abbreviation('tm', u'™')
    keyboard.add_abbreviation('3n', u'el3ctron') 
    

    so, i executed on my command line ./k3y it runs showing no error, but when i do some abreviation (for example writting in another window 3n), or pressing some hot key ('page up, page down') nothing happens! i do not know if i am doing something wrong. :(

    opened by el3ctron 21
  • Linux problems on basic example

    Linux problems on basic example

    Hi, me again :-) Got me a Linux laptop and trying to really use the lib on it, because of course, no AutoHotKey... Unfortunately I can't get it to run a two-line test example (import keyboard, define one abbreviation). With Python 2.7 it bombs:

    Exception in thread Thread-1:
    Traceback (most recent call last):
      File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
        self.run()
      File "/usr/lib/python2.7/threading.py", line 754, in run
        self.__target(*self.__args, **self.__kwargs)
      File "/home/fpp/python/PyHotKey/keyboard/__init__.py", line 114, in listen
        _os_keyboard.listen(self.queue)
      File "/home/fpp/python/PyHotKey/keyboard/_nixkeyboard.py", line 111, in listen
        build_device()
      File "/home/fpp/python/PyHotKey/keyboard/_nixkeyboard.py", line 106, in build_device
        device = aggregate_devices('kbd')
      File "/home/fpp/python/PyHotKey/keyboard/_nixcommon.py", line 145, in aggregate_devices
        uinput = make_uinput()
      File "/home/fpp/python/PyHotKey/keyboard/_nixcommon.py", line 48, in make_uinput
        uinput.read = lambda n: Queue().get()
    AttributeError: 'file' object attribute 'read' is read-only
    

    With Python3.5 there is no exception but no abbreviation expanding either...

    This is on XUbuntu 16.04, running the script as root in xterm and testing in Mousepad. Anything I'm doing wrong ?...

    opened by fpp-gh 16
  • Difference between read_hotkey and add_hotkey

    Difference between read_hotkey and add_hotkey

    I'm using this package to control a piece of hardware:

    adjust = True
    while adjust:
        if keyboard.read_key() == 'esc':
            adjust = False
    
        elif keyboard.read_key() == 'left':
            move_left()
    

    Now I would like to use hotkeys, e.g. something like

    adjust = True
    while adjust:
        if keyboard.read_key() == 'esc':
            adjust = False
    
        elif keyboard.read_key() == 'left':
            move_left()
    
        elif keyboard.read_key() == 'ctrl+left':    # Use read_hotkey, add_hotkey, or some other function?
            move_left_large_step()
    

    From the documentation, it's not clear which function to use and how. Specifically, what is the difference between read_hotkey and add_hotkey and which of these two is the right one?

    opened by danielbaumer 14
  • Can't map some keys

    Can't map some keys

    Hi, thanks for this library, I'm trying to make use of it to create a simple custom hotkey "alias". I'm on a MacBook Air running Linux (Gentoo).

    import keyboard
    import time
    
    keyboard.clear_all_hotkeys()
    
    keyboard.add_hotkey('win+c', lambda: keyboard.send('ctrl+c'))
    keyboard.add_hotkey('win+v', lambda: keyboard.send('ctrl+v'))
    
    keyboard.add_hotkey('win+l', lambda: keyboard.send('ctrl+l'))
    keyboard.add_hotkey('win+e', lambda: keyboard.send('ctrl+l'))
    
    while True:
        time.sleep(10)
    

    On the script above, win+l and win+e are calling the same keyboard hotkey but only win+e works. I'm hitting those hotkeys on Chrome browser.

    If I change those mappings to a debugger output:

    keyboard.add_hotkey('win+c', lambda: print('ctrl+c'))
    keyboard.add_hotkey('win+v', lambda: print('ctrl+v'))
    
    keyboard.add_hotkey('win+l', lambda: print('ctrl+l'))
    keyboard.add_hotkey('win+e', lambda: print('ctrl+l'))
    

    I do see the output on the console. Do you have any idea what could be cause these events to not be correctly processed by chrome?

    P.S.: I don't think it's relative to Chrome, as the same hotkeys don't work on other applications (e.g. termite).

    opened by bpinto 14
  • AttributeError: module 'keyboard._darwinkeyboard' has no attribute 'type_unicode'

    AttributeError: module 'keyboard._darwinkeyboard' has no attribute 'type_unicode'

    Hello, I am testing your "write.py" example on OSX Sierra 10.12.6. I tested this using the native python 2.7.10 and brew install of python 3 at 3.6.2. Used pip to install keyboard once in both python environments. Both had identical errors listed below.

    The program actually works, but then crashes with the following error:

    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/site-packages/keyboard/__init__.py", line 570, in write
        scan_code, modifiers = _os_keyboard.map_char(letter)
      File "/usr/local/lib/python3.6/site-packages/keyboard/_darwinkeyboard.py", line 390, in map_char
        return key_controller.map_char(character)
      File "/usr/local/lib/python3.6/site-packages/keyboard/_darwinkeyboard.py", line 305, in map_char
        return self.key_map.character_to_vk(character)
      File "/usr/local/lib/python3.6/site-packages/keyboard/_darwinkeyboard.py", line 153, in character_to_vk
        raise ValueError("Unrecognized character: {}".format(character))
    ValueError: Unrecognized character: enter
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "write.py", line 14, in <module>
        keyboard.write(line)
      File "/usr/local/lib/python3.6/site-packages/keyboard/__init__.py", line 584, in write
        _os_keyboard.type_unicode(letter)
    AttributeError: module 'keyboard._darwinkeyboard' has no attribute 'type_unicode'
    

    I cannot tell if this is a configuration, dependency or other problem. But it is an issue with one of the standard examples.

    Thanks for your Open Source contributions.

    Regards, -FT

    bug osx waiting-for-feedback 
    opened by ftpersonal 13
  • [bugs:macosX][questions] how to send binary stream through this component to create exe, jar, zip and other files

    [bugs:macosX][questions] how to send binary stream through this component to create exe, jar, zip and other files

    [questions] 1, browser-based vpn 2, prohibit file upload, download, prohibit using the clipboard 3, only allow keyboard input 4, how to send binary stream through this component to create bin exe, jar, zip and other files

    [questions] 1、基于浏览器的vpn 2、禁止文件上传、下载、禁止使用剪切板 3、仅允许键盘输入 4、如何通过本组件发送二进制流创建exe、jar、zip等文件

    😀🤝🌹

    opened by hktalent 12
  • Media keys on Windows

    Media keys on Windows

    Not sure if I am doing something wrong, I am trying to test media keys on Windows 10.

    I have a super simple script just containing:

    keyboard.press_and_release('play/pause media')

    Then I play audio using VLC player, when I run my script I expect VLC to pause but nothing happens (no errors either).

    Any ideas?

    bug windows waiting-for-feedback 
    opened by jbardnz 12
  • Alt keys aren't detected properly

    Alt keys aren't detected properly

    As mentioned in a thread about a different issue:

    When I run this program:

    import keyboard
    def info(event):
        print (event.name + ", " + str(event.scan_code) + ", " + event.event_type)
    keyboard.hook(info)
    keyboard.wait("esc")
    

    and press left alt, I see "left alt, 56, down" as expected. When I release left alt, I see left alt, 56, up left alt, 56, down left alt, 56, up

    When I press and release right alt, I see: left alt, 56, down left alt, 56, up

    I went looking for someplace else to test my keyboard events, and found https://w3c.github.io/uievents/tools/key-event-viewer.html When I press and release left alt and then right alt in this tool, it looks like this: http://i.imgur.com/FNNKpZn.png It's not showing either problem.

    I was slightly surprised that it was reporting my numlock status in this other tool. I tried turning off numlock to see if that made any difference to my "keyboard" problem. It didn't.

    Windows 8.1 Tested on Python 2.7.13 and 3.6.0 keyboard 0.9.12

    bug windows waiting-for-feedback 
    opened by Hyphen-ated 12
  • Fix write work with delay

    Fix write work with delay

    Hello! I was working on my joke project using this library and found a strange bug. The delay parameter in the write function does not work correctly on Mac OS. We don't wait every delay time before every letter input, but wait a delay before every word input.

    Issue: https://github.com/boppreh/keyboard/issues/582

    opened by DanilXO 0
  • Incorrect work with delay in write function

    Incorrect work with delay in write function

    Hello! I was working on my joke project using this library and found a strange bug. The delay parameter in the write function does not work correctly on Mac OS. We don't wait every delay time before every letter input, but wait a delay before every word input.

    This is very easy to fix. Like this:

    def write(text, delay=0, restore_state_after=True, exact=None):
        """
        ...
        """
        if exact is None:
            exact = _platform.system() == 'Windows'
    
        state = stash_state()
        
        # Window's typing of unicode characters is quite efficient and should be preferred.
        if exact:
            for letter in text:
                if letter in '\n\b':
                    send(letter)
                else:
                    _os_keyboard.type_unicode(letter)
                if delay: _time.sleep(delay)
        else:
            for letter in text:
                try:
                    entries = _os_keyboard.map_name(normalize_name(letter))
                    scan_code, modifiers = next(iter(entries))
                except (KeyError, ValueError):
                    _os_keyboard.type_unicode(letter)
                    # todo: We should add "if delay: _time.sleep(delay)" here.
                    continue
                
                for modifier in modifiers:
                    press(modifier)
    
                _os_keyboard.press(scan_code)
                _os_keyboard.release(scan_code)
    
                for modifier in modifiers:
                    release(modifier)
    
                if delay:
                    _time.sleep(delay)
    
        if restore_state_after:
            restore_modifiers(state)
    

    Should I create a PR for this?

    opened by DanilXO 1
  • Question: is there any way to get if any non specified key was pressed without blocking

    Question: is there any way to get if any non specified key was pressed without blocking

    pretty much i just need to check if any key on the keyboard without having to specify a key to check is pressed without blocking program from continuing if there is none

    while True:
        if keyboard.read_event("any key") == True):
    		print("doing thing 1")
    	else:
    		print("doing thing 2")
    

    and idk if im crazy but i cant seem to find anything that does that in the documentation

    opened by garandal245 0
  • Add

    Add "fn" key

    As far as I can tell there is not support for adding the "fn" or "function" key as a modifier.

    This would be a great feature to have.

    opened by kylejbrk 0
  • Adjust string typing speed

    Adjust string typing speed

    I would like to speed up the time it takes to type a string. I can see it muster up long sentences, it can take a while.

    Is there a way to speed this up or do this instantly like "copy/paste"?

    opened by high-solutions 1
Releases(v0.13.5)
  • v0.13.5(Mar 23, 2020)

  • v0.13.4(Sep 25, 2019)

  • v0.13.3(Mar 18, 2019)

    • [Windows] Fix overflow error on Python 3.7.
    • [Mac] Added alt gr -> alt mapping.
    • [Mac] Added support for right shift.
    • [All] Fixed numlock alias.
    • [All] Fixed example code.
    Source code(tar.gz)
    Source code(zip)
  • v0.13.2(May 18, 2018)

    • [Mac] Fixed "map_name" error (i.e. implement new backend API).
    • [Win] Improve detection of "right alt" key.
    • [All] Misc fixes for edge cases.
    Source code(tar.gz)
    Source code(zip)
  • v0.13.1(Mar 27, 2018)

  • v0.13.0(Mar 26, 2018)

    • [All] New remap_ and block_ functions.
    • [All] New high-level functions for parsing and converting hotkey names.
    • [All] Added .modifiers and .is_keymap attribute to events.
    • [All] Event name now matches character typed (e.g. now event from key 1 reports as ! if shift is pressed). This gives get_typed_strings more precision.
    • [Windows] New key suppression system should fix most bugs with suppress=True.
    • [Linux] Added .device attribute to events.
    • [All] Many, many bugfixes.
    Source code(tar.gz)
    Source code(zip)
  • v0.11.0(Aug 24, 2017)

    • [Windows] Used explicit WinDLL to fix "expected CFunctionType instance instead of CFunctionType".
    • [Windows] Added more Windows virtual key codes for key name mapping (should fix .e.g "?").
    • [All] Fixed canonicalization removing too much space (thanks @iliazeus).
    • [All] Added start_recording and stop_recording for more flexible macros (thanks @softuser25 for the suggestion).
    • [All] Added read_shortcut function.
    • [All] Added get_shortcut_name function.
    • [All] Cleaned up examples folder and added more examples.
    Source code(tar.gz)
    Source code(zip)
  • v0.10.4(Aug 15, 2017)

    • [Mac] Added aliases for modifiers (control->ctrl, option->alt, command->windows).
    • [All] Add reference to mouse project.
    • [All] Use WinDLL for mouse part instead of raw ctypes.windll.user32.
    Source code(tar.gz)
    Source code(zip)
  • v0.10.3(Aug 8, 2017)

  • v0.10.2(Aug 8, 2017)

    • [All] Removed ctypes type-hints to avoid runtime errors in unusual systems.
    • [All] Add mention of new mouse project.
    • [All] Add mention of experimental OS X support.
    • [All] Fixes to release process.
    Source code(tar.gz)
    Source code(zip)
  • v0.10.0(Aug 3, 2017)

    • [OS X] Added experimental OS X support (thanks @glitchassassin!).
    • [Windows] Fixed error on fractional mouse.wheel() (thanks @bobonthenet!).
    • [Windows] Fixed name for arrow keys` virtual key codes.
    • [Windows] Make backend easier to use in other projects (e.g. _winkeyboard.prepare_intercept).
    • [Linux] Fixed mouse support in Mint VirtualBox guest (thanks @foodforarabbit!).
    • [All] Added mouse alias hold = press (thanks @DanMossa!).
    • [All] Added mouse.drag.
    • [All] Added examples on how to use the library.
    • [All] Update docs to mention how to differentiate key presses and releases (thanks @TrakJohnson!).
    • [All] Change the default value of add_abbreviation(..., match_suffix).
    Source code(tar.gz)
    Source code(zip)
  • v0.9.12(Feb 4, 2017)

    • [Windows] Fixed some incorrect key names (e.g. enter as '\r', and left keys reported as 'right ...')
    • [Python2] long scan codes no longer crash the matches function.
    • [All] add read_key function, which blocks and returns the next event.
    • [All] Added makefile.
    Source code(tar.gz)
    Source code(zip)
  • v0.9.11(Feb 2, 2017)

  • v0.9.10(Jan 29, 2017)

    • [Windows] Add suppress parameter to hotkeys to block the combination from being sent to other programs.
    • [Windows] Better key mapping for common keys (now using Virtual Key Codes when possible).
    • [Windows] Normalize numpad and key code names.
    • [Linux] Errors about requiring sudo are now thrown in the main thread, making them catchable.
    • [All] wheel method in mouse module.
    Source code(tar.gz)
    Source code(zip)
  • v0.9.9(Dec 18, 2016)

    • [Windows] Include scan codes in generated events, instead of only Virtual Key Codes. This allows software like Citrix to receive the events correctly.
    • [Windows] Fix bugs that prevented keys without associated Virtual Key Codes from beign processed.
    Source code(tar.gz)
    Source code(zip)
  • v0.9.8(Dec 10, 2016)

  • v0.9.7(Nov 16, 2016)

  • v0.9.6(Nov 14, 2016)

    • [Windows] Modifier keys now report 'left' or 'right' on their names.
    • [Windows] Keypad attribute should be much more accurate even with NumLock.
    • [Windows] Media keys are now fully supported for both report and playback.
    Source code(tar.gz)
    Source code(zip)
  • v0.9.5(Nov 14, 2016)

    • [Windows] Add aliases to correct page down/page up names.
    • [Windows] Fixed a bug where left and right key events were being created without names.
    • [Windows] Prefer to report home/page up/page down/end keys as such instead of their keypad names.
    Source code(tar.gz)
    Source code(zip)
  • v0.9.4(Nov 13, 2016)

  • v0.9.3(Nov 13, 2016)

  • v0.9.2(Nov 13, 2016)

  • v0.9.1(Nov 13, 2016)

    • Add add_abbreviation and register_word_listener functions.
    • Add functions for low level hooks (hook, hook_key).
    • Add on_press and on_release functions.
    • Add alternative names (aliases) for many functions.
    • Add large number of alternative key names, especially for accents.
    • Make module produce and consume JSON if ran as script (python -m keyboard).
    • 100% test coverage.
    • [Linux] Add support for writing arbitrary Unicode.
    • [Linux] Look for Linux keyboard devices in /proc/bus/input/devices.
    • [Linux] Aggregate as many devices as possibles (e.g. USB keyboard on notebook).
    • [Linux] Improved support for internationalized keys.
    • [Windows] Process keys asynchronously to reduce key delay.
    • [All] Too many bugfixes to count.
    • [All] Major backend refactor.
    Source code(tar.gz)
    Source code(zip)
Owner
BoppreH
BoppreH
The purpose of this script is to bypass disablefund, provide some useful information, and dig the hook function of PHP extension.

The purpose of this script is to bypass disablefund, provide some useful information, and dig the hook function of PHP extension.

Firebasky 14 Aug 2, 2021
Pre-commit hook for upgrading type hints

This is a pre-commit hook configured to automatically upgrade your type hints to the new native types implemented in PEP 585.

snok 54 Nov 14, 2022
一个IDA脚本,可以检测出哈希算法(无论是否魔改常数)并生成frida hook 代码。

findhash 在哈希算法上,比Findcrypt更好的检测工具,同时生成Frida hook代码。 使用方法 把findhash.xml和findhash.py扔到ida plugins目录下 ida -edit-plugin-findhash 试图解决的问题 哈希函数的初始化魔数被修改 想快速

null 266 Dec 29, 2022
A browser login credentials thief for windows and Linux

Thief ???? A browser login credentials thief for windows and Linux Python script to decrypt login credentials from browsers in windows or linux Decryp

Ash 1 Dec 13, 2021
An unofficial opensource Pokemon cursor theme for Windows and Linux.

pokemon-cursor An unofficial opensource Pokemon cursor theme for Windows and Linux. Cursor Sizes 22 24 28 32 40 48 56 64 72 80 88 96 Colors Quick inst

Kaiz Khatri 72 Dec 26, 2022
Tomador de ramos UC automatico para Windows, Linux y macOS

auto-ramos v2.0 Tomador de ramos UC automatico para Windows, Linux y macOS Funcion Este script de Python tiene como principal objetivo hacer que la to

Open Source eUC 13 Jun 29, 2022
Hashcrack - A non-object oriented open source, Software for Windows/Linux made in Python 3

Multi Force This project is a non-object oriented open source, Software for Wind

Radiationbolt 3 Jan 2, 2023
LSO, also known as Linux Swap Operator, is a software with both GUI and terminal versions that you can manage the Swap area for Linux operating systems.

LSO - Linux Swap Operator Türkçe - LSO Nedir? LSO, diğer adıyla Linux Swap Operator Linux işletim sistemleri için Swap alanını yönetebileceğiniz hem G

Eren İnce 4 Feb 9, 2022
List of Linux Tools I put on almost every linux / Debian host

Linux-Tools List of Linux Tools I put on almost every Linux / Debian host Installed: geany --> GUI editor/ notepad++ like chkservice --> TUI Linux ser

Stew Alexander 20 Jan 2, 2023
Organize seu linux - organize your linux

OrganizeLinux Organize seu linux - organize your linux Organize seu linux Uma forma rápida de separar arquivos dispersos em pastas. formatos a serem c

Marcus Vinícius Ribeiro Andrade 1 Nov 30, 2021
Implementation of the Angular Spectrum method in Python to simulate Diffraction Patterns

Diffraction Simulations - Angular Spectrum Method Implementation of the Angular Spectrum method in Python to simulate Diffraction Patterns with arbitr

Rafael de la Fuente 276 Dec 30, 2022
A Python library to simulate a Zoom H6 recorder remote control

H6 A Python library to emulate a Zoom H6 recorder remote control Introduction This library allows you to control your Zoom H6 recorder from your compu

Matias Godoy 68 Nov 2, 2022
Probably the best way to simulate block scopes in Python

This is a package, as it says on the tin, to emulate block scoping in Python, the lack of which being a clever design choice yet sometimes a trouble.

null 88 Oct 26, 2022
This is a Python program I wrote to simulate the solar system with 79 lines of code.

Solar System With Python This is a Python program I wrote to simulate the solar system with 79 lines of code. Required modules tkinter, math, time Why

Mehmet Aydoğmuş 1 Oct 26, 2021
A redesign of our previous Python World Cup, aiming to simulate the 2022 World Cup all the way from the qualifiers

A redesign of our previous Python World Cup, aiming to simulate the 2022 World Cup all the way from the qualifiers. This new version is designed to be more compact and more efficient and will reflect the improvements in our programming ability.

Sam Counsell 1 Jan 7, 2022
Manipulation OpenAI Gym environments to simulate robots at the STARS lab

liegroups Python implementation of SO2, SE2, SO3, and SE3 matrix Lie groups using numpy or PyTorch. [Documentation] Installation To install, cd into t

STARS Laboratory 259 Dec 11, 2022
MeerKAT radio telescope simulation package. Built to simulate multibeam antenna data.

MeerKATgen MeerKAT radio telescope simulation package. Designed with performance in mind and utilizes Just in time compile (JIT) and XLA backed vectro

Peter Ma 6 Jan 23, 2022
This is a library for simulate probability theory problems specialy conditional probability

This is a library for simulate probability theory problems specialy conditional probability. It is also useful to create custom single or joint distribution with specific PMF or PDF to get probability table and genearte data based on probability function.

Mohamadreza Kariminejad 6 Mar 30, 2022
⚡KiCad library containing footprints and symbols for inductive analog keyboard switches

Inductive Analog Switches This library contains footprints and symbols for inductive analog keyboard switches for use with the Texas Instruments LDC13

Elias Sjögreen 3 Jun 30, 2022