如何生成键盘事件?

简短摘要:

我正在尝试创建一个程序,将发送键盘事件到计算机的所有目的模拟事件应该被视为实际的键盘击键。

original post:

我正在寻找一种使用 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

上面显然是一些例子,但是我所寻找的是一个库、模块或其他任何东西,我可以使用它们来模拟键盘事件。

Note : 这不同于将字符发送到记事本,或将文本输入到字段等。我希望 Python 脚本模拟一个实际的键盘事件,计算机会认为真的有一个键盘事件。

附注:

我不想发送击键到活动窗口-我希望系统相信键盘的键被按下,微妙的差异,因为一些活动窗口不接受某些键组合,或者如果我想通过我的脚本使用键盘快捷方式进行后台处理,他们不需要通过活动窗口

到目前为止,我已经看到了这些东西:

Generate keyboard events for the frontmost application

如何通过 Python 生成键盘按键事件?

都是关于苹果的,一点用都没有。

还有这个:

在 Python 上模拟键盘和鼠标最简单的方法是什么

这似乎是我所需要的,但我找不到它的库或任何文档。

我也找了更多的地方,但还没有找到解决办法。

275260 次浏览

每个平台都有不同的方法来生成键盘事件。这是因为它们都需要使用系统库(和系统扩展)。对于跨平台解决方案,您需要采用这些解决方案中的每一个,然后进行平台检查,以执行适当的方法。

对于窗口,您可以使用 Pywin32扩展名

win32api.keybd_event

keybd_event(bVk, bScan, dwFlags, dwExtraInfo)

模拟键盘事件

参数

BVk: BYTE-虚拟密钥代码
硬件扫描代码
DwFlags = 0: DWORD-指定各种函数选项的标志
DwExtraInfo = 0: DWORD-与击键相关的附加数据

You will need to investigate pywin32 for how to properly use it, as I have never used it.

仅适用于 Windows: 您可以使用 铁蟒图书馆来允许 cPython 访问。NET 框架。然后使用。NET 或更通用的 发送来模拟击键。

仅使用 OS X: 使用 PyObject然后使用 CGEventCreateKeyboardEvent调用。

充分披露: 我只在 OS X 上用 Python 做过这个,但是我用过。NET sendkey (使用 C #) ,这非常好。

可以使用 ctype 完成:

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是 WindowsAPI 定义的虚拟键盘映射。代码列表可在 MSDN: 虚拟密钥代码(Windows)上获得

user648852's idea at least for me works great for OS X, here is the code to do it:

#!/usr/bin/env python


import time
from Quartz.CoreGraphics import CGEventCreateKeyboardEvent
from Quartz.CoreGraphics import CGEventPost


# Python releases things automatically, using CFRelease will result in a scary error
#from Quartz.CoreGraphics import CFRelease


from Quartz.CoreGraphics import kCGHIDEventTap


# From http://stackoverflow.com/questions/281133/controlling-the-mouse-from-python-in-os-x
# and from https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/index.html#//apple_ref/c/func/CGEventCreateKeyboardEvent




def KeyDown(k):
keyCode, shiftKey = toKeyCode(k)


time.sleep(0.0001)


if shiftKey:
CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
time.sleep(0.0001)


CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
time.sleep(0.0001)


if shiftKey:
CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
time.sleep(0.0001)


def KeyUp(k):
keyCode, shiftKey = toKeyCode(k)


time.sleep(0.0001)


CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
time.sleep(0.0001)


def KeyPress(k):
keyCode, shiftKey = toKeyCode(k)


time.sleep(0.0001)


if shiftKey:
CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
time.sleep(0.0001)


CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
time.sleep(0.0001)


CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
time.sleep(0.0001)


if shiftKey:
CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
time.sleep(0.0001)






# From http://stackoverflow.com/questions/3202629/where-can-i-find-a-list-of-mac-virtual-key-codes


def toKeyCode(c):
shiftKey = False
# Letter
if c.isalpha():
if not c.islower():
shiftKey = True
c = c.lower()


if c in shiftChars:
shiftKey = True
c = shiftChars[c]
if c in keyCodeMap:
keyCode = keyCodeMap[c]
else:
keyCode = ord(c)
return keyCode, shiftKey


shiftChars = {
'~': '`',
'!': '1',
'@': '2',
'#': '3',
'$': '4',
'%': '5',
'^': '6',
'&': '7',
'*': '8',
'(': '9',
')': '0',
'_': '-',
'+': '=',
'{': '[',
'}': ']',
'|': '\\',
':': ';',
'"': '\'',
'<': ',',
'>': '.',
'?': '/'
}




keyCodeMap = {
'a'                 : 0x00,
's'                 : 0x01,
'd'                 : 0x02,
'f'                 : 0x03,
'h'                 : 0x04,
'g'                 : 0x05,
'z'                 : 0x06,
'x'                 : 0x07,
'c'                 : 0x08,
'v'                 : 0x09,
'b'                 : 0x0B,
'q'                 : 0x0C,
'w'                 : 0x0D,
'e'                 : 0x0E,
'r'                 : 0x0F,
'y'                 : 0x10,
't'                 : 0x11,
'1'                 : 0x12,
'2'                 : 0x13,
'3'                 : 0x14,
'4'                 : 0x15,
'6'                 : 0x16,
'5'                 : 0x17,
'='                 : 0x18,
'9'                 : 0x19,
'7'                 : 0x1A,
'-'                 : 0x1B,
'8'                 : 0x1C,
'0'                 : 0x1D,
']'                 : 0x1E,
'o'                 : 0x1F,
'u'                 : 0x20,
'['                 : 0x21,
'i'                 : 0x22,
'p'                 : 0x23,
'l'                 : 0x25,
'j'                 : 0x26,
'\''                : 0x27,
'k'                 : 0x28,
';'                 : 0x29,
'\\'                : 0x2A,
','                 : 0x2B,
'/'                 : 0x2C,
'n'                 : 0x2D,
'm'                 : 0x2E,
'.'                 : 0x2F,
'`'                 : 0x32,
'k.'                : 0x41,
'k*'                : 0x43,
'k+'                : 0x45,
'kclear'            : 0x47,
'k/'                : 0x4B,
'k\n'               : 0x4C,
'k-'                : 0x4E,
'k='                : 0x51,
'k0'                : 0x52,
'k1'                : 0x53,
'k2'                : 0x54,
'k3'                : 0x55,
'k4'                : 0x56,
'k5'                : 0x57,
'k6'                : 0x58,
'k7'                : 0x59,
'k8'                : 0x5B,
'k9'                : 0x5C,


# keycodes for keys that are independent of keyboard layout
'\n'                : 0x24,
'\t'                : 0x30,
' '                 : 0x31,
'del'               : 0x33,
'delete'            : 0x33,
'esc'               : 0x35,
'escape'            : 0x35,
'cmd'               : 0x37,
'command'           : 0x37,
'shift'             : 0x38,
'caps lock'         : 0x39,
'option'            : 0x3A,
'ctrl'              : 0x3B,
'control'           : 0x3B,
'right shift'       : 0x3C,
'rshift'            : 0x3C,
'right option'      : 0x3D,
'roption'           : 0x3D,
'right control'     : 0x3E,
'rcontrol'          : 0x3E,
'fun'               : 0x3F,
'function'          : 0x3F,
'f17'               : 0x40,
'volume up'         : 0x48,
'volume down'       : 0x49,
'mute'              : 0x4A,
'f18'               : 0x4F,
'f19'               : 0x50,
'f20'               : 0x5A,
'f5'                : 0x60,
'f6'                : 0x61,
'f7'                : 0x62,
'f3'                : 0x63,
'f8'                : 0x64,
'f9'                : 0x65,
'f11'               : 0x67,
'f13'               : 0x69,
'f16'               : 0x6A,
'f14'               : 0x6B,
'f10'               : 0x6D,
'f12'               : 0x6F,
'f15'               : 0x71,
'help'              : 0x72,
'home'              : 0x73,
'pgup'              : 0x74,
'page up'           : 0x74,
'forward delete'    : 0x75,
'f4'                : 0x76,
'end'               : 0x77,
'f2'                : 0x78,
'page down'         : 0x79,
'pgdn'              : 0x79,
'f1'                : 0x7A,
'left'              : 0x7B,
'right'             : 0x7C,
'down'              : 0x7D,
'up'                : 0x7E
}

对于 python3和 python2,都可以使用 pyautogui(pip install pyautogui)

from pyautogui import press, typewrite, hotkey


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

它还可以跨平台使用 Windows、 OSX 和 Ubuntu LTS。

MacOS

下面是 @ Phylliida 的回答的更完整的类形式版本和代码示例:

#!/usr/bin/python
# Script simulating keyboard events in macOS.
# See: https://stackoverflow.com/q/13564851/55075


import sys
import time
from Quartz.CoreGraphics import CGEventCreateKeyboardEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGHIDEventTap
#from Quartz.CoreGraphics import CFRelease # Python releases things automatically.


class Keyboard():
shiftChars = {
'~': '`',
'!': '1',
'@': '2',
'#': '3',
'$': '4',
'%': '5',
'^': '6',
'&': '7',
'*': '8',
'(': '9',
')': '0',
'_': '-',
'+': '=',
'{': '[',
'}': ']',
'|': '\\',
':': ';',
'"': '\'',
'<': ',',
'>': '.',
'?': '/'
}




keyCodeMap = {
'a'              : 0x00,
's'              : 0x01,
'd'              : 0x02,
'f'              : 0x03,
'h'              : 0x04,
'g'              : 0x05,
'z'              : 0x06,
'x'              : 0x07,
'c'              : 0x08,
'v'              : 0x09,
'b'              : 0x0B,
'q'              : 0x0C,
'w'              : 0x0D,
'e'              : 0x0E,
'r'              : 0x0F,
'y'              : 0x10,
't'              : 0x11,
'1'              : 0x12,
'2'              : 0x13,
'3'              : 0x14,
'4'              : 0x15,
'6'              : 0x16,
'5'              : 0x17,
'='              : 0x18,
'9'              : 0x19,
'7'              : 0x1A,
'-'              : 0x1B,
'8'              : 0x1C,
'0'              : 0x1D,
']'              : 0x1E,
'o'              : 0x1F,
'u'              : 0x20,
'['              : 0x21,
'i'              : 0x22,
'p'              : 0x23,
'l'              : 0x25,
'j'              : 0x26,
'\''             : 0x27,
'k'              : 0x28,
';'              : 0x29,
'\\'             : 0x2A,
','              : 0x2B,
'/'              : 0x2C,
'n'              : 0x2D,
'm'              : 0x2E,
'.'              : 0x2F,
'`'              : 0x32,
'k.'             : 0x41,
'k*'             : 0x43,
'k+'             : 0x45,
'kclear'         : 0x47,
'k/'             : 0x4B,
'k\n'            : 0x4C,
'k-'             : 0x4E,
'k='             : 0x51,
'k0'             : 0x52,
'k1'             : 0x53,
'k2'             : 0x54,
'k3'             : 0x55,
'k4'             : 0x56,
'k5'             : 0x57,
'k6'             : 0x58,
'k7'             : 0x59,
'k8'             : 0x5B,
'k9'             : 0x5C,


# keycodes for keys that are independent of keyboard layout
'\n'             : 0x24,
'\t'             : 0x30,
' '              : 0x31,
'del'            : 0x33,
'delete'         : 0x33,
'esc'            : 0x35,
'escape'         : 0x35,
'cmd'            : 0x37,
'command'        : 0x37,
'shift'          : 0x38,
'caps lock'      : 0x39,
'option'         : 0x3A,
'ctrl'           : 0x3B,
'control'        : 0x3B,
'right shift'    : 0x3C,
'rshift'         : 0x3C,
'right option'   : 0x3D,
'roption'        : 0x3D,
'right control'  : 0x3E,
'rcontrol'       : 0x3E,
'fun'            : 0x3F,
'function'       : 0x3F,
'f17'            : 0x40,
'volume up'      : 0x48,
'volume down'    : 0x49,
'mute'           : 0x4A,
'f18'            : 0x4F,
'f19'            : 0x50,
'f20'            : 0x5A,
'f5'             : 0x60,
'f6'             : 0x61,
'f7'             : 0x62,
'f3'             : 0x63,
'f8'             : 0x64,
'f9'             : 0x65,
'f11'            : 0x67,
'f13'            : 0x69,
'f16'            : 0x6A,
'f14'            : 0x6B,
'f10'            : 0x6D,
'f12'            : 0x6F,
'f15'            : 0x71,
'help'           : 0x72,
'home'           : 0x73,
'pgup'           : 0x74,
'page up'        : 0x74,
'forward delete' : 0x75,
'f4'             : 0x76,
'end'            : 0x77,
'f2'             : 0x78,
'page down'      : 0x79,
'pgdn'           : 0x79,
'f1'             : 0x7A,
'left'           : 0x7B,
'right'          : 0x7C,
'down'           : 0x7D,
'up'             : 0x7E
}


# See: https://stackoverflow.com/q/3202629/55075
def toKeyCode(self, c):
shiftKey = False
# Letter
if c.isalpha():
if not c.islower():
shiftKey = True
c = c.lower()
if c in Keyboard.shiftChars:
shiftKey = True
c = Keyboard.shiftChars[c]
if c in Keyboard.keyCodeMap:
keyCode = Keyboard.keyCodeMap[c]
else:
keyCode = ord(c)
return keyCode, shiftKey


def KeyDown(self, k):
keyCode, shiftKey = self.toKeyCode(k)


time.sleep(0.0001)


if shiftKey:
CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
time.sleep(0.0001)


CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
time.sleep(0.0001)


if shiftKey:
CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
time.sleep(0.0001)


def KeyUp(self, k):
keyCode, shiftKey = self.toKeyCode(k)


time.sleep(0.0001)


CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
time.sleep(0.0001)


def KeyPress(self, k):
keyCode, shiftKey = self.toKeyCode(k)


time.sleep(0.0001)


if shiftKey:
CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
time.sleep(0.0001)


CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
time.sleep(0.0001)


CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
time.sleep(0.0001)


if shiftKey:
CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
time.sleep(0.0001)


def Type(self, text):
for key in text:
self.KeyDown(key)
self.KeyUp(key)

Here is the demo code using above class:

# DEMO
if __name__ == '__main__':
keyboard = Keyboard()
if sys.platform == "darwin":
keyboard.Type('Hello World!')
elif sys.platform == "win32":
print("Error: Platform not supported!")

它将模拟在当前窗口中键入 Hello World!文本。

您可以将上面的代码作为 shell 脚本运行。

对于 Python 2.7(windows32) ,我只安装了 Pywin32-223。 And I wrote simple python`s code:

import win32api
import time
import win32con


# simulate the pressing-DOWN "ARROW key" of 200 times


for i in range(200):
time.sleep(0.5)
win32api.keybd_event(0x28, 0,0,0)
time.sleep(.05)
win32api.keybd_event(0x28,0 ,win32con.KEYEVENTF_KEYUP ,0)

如果您运行代码并立即转到记事本窗口(文本已经存在的位置)并将光标放在顶行上,则可以检查它。

I had this same problem and made my own library for it that uses ctypes:

"""
< --- CTRL by [object Object] --- >
Only works on windows.
Some characters only work with a US standard keyboard.
Some parts may also only work in python 32-bit.
"""


#--- Setup ---#
from ctypes import *
from time import sleep
user32 = windll.user32
kernel32 = windll.kernel32
delay = 0.01


####################################
###---KEYBOARD CONTROL SECTION---###
####################################


#--- Key Code Variables ---#
class key:
cancel = 0x03
backspace = 0x08
tab = 0x09
enter = 0x0D
shift = 0x10
ctrl = 0x11
alt = 0x12
capslock = 0x14
esc = 0x1B
space = 0x20
pgup = 0x21
pgdown = 0x22
end = 0x23
home = 0x24
leftarrow = 0x26
uparrow = 0x26
rightarrow = 0x27
downarrow = 0x28
select = 0x29
print = 0x2A
execute = 0x2B
printscreen = 0x2C
insert = 0x2D
delete = 0x2E
help = 0x2F
num0 = 0x30
num1 = 0x31
num2 = 0x32
num3 = 0x33
num4 = 0x34
num5 = 0x35
num6 = 0x36
num7 = 0x37
num8 = 0x38
num9 = 0x39
a = 0x41
b = 0x42
c = 0x43
d = 0x44
e = 0x45
f = 0x46
g = 0x47
h = 0x48
i = 0x49
j = 0x4A
k = 0x4B
l = 0x4C
m = 0x4D
n = 0x4E
o = 0x4F
p = 0x50
q = 0x51
r = 0x52
s = 0x53
t = 0x54
u = 0x55
v = 0x56
w = 0x57
x = 0x58
y = 0x59
z = 0x5A
leftwin = 0x5B
rightwin = 0x5C
apps = 0x5D
sleep = 0x5F
numpad0 = 0x60
numpad1 = 0x61
numpad3 = 0x63
numpad4 = 0x64
numpad5 = 0x65
numpad6 = 0x66
numpad7 = 0x67
numpad8 = 0x68
numpad9 = 0x69
multiply = 0x6A
add = 0x6B
seperator = 0x6C
subtract = 0x6D
decimal = 0x6E
divide = 0x6F
F1 = 0x70
F2 = 0x71
F3 = 0x72
F4 = 0x73
F5 = 0x74
F6 = 0x75
F7 = 0x76
F8 = 0x77
F9 = 0x78
F10 = 0x79
F11 = 0x7A
F12 = 0x7B
F13 = 0x7C
F14 = 0x7D
F15 = 0x7E
F16 = 0x7F
F17 = 0x80
F19 = 0x82
F20 = 0x83
F21 = 0x84
F22 = 0x85
F23 = 0x86
F24 = 0x87
numlock = 0x90
scrolllock = 0x91
leftshift = 0xA0
rightshift = 0xA1
leftctrl = 0xA2
rightctrl = 0xA3
leftmenu = 0xA4
rightmenu = 0xA5
browserback = 0xA6
browserforward = 0xA7
browserrefresh = 0xA8
browserstop = 0xA9
browserfavories = 0xAB
browserhome = 0xAC
volumemute = 0xAD
volumedown = 0xAE
volumeup = 0xAF
nexttrack = 0xB0
prevoustrack = 0xB1
stopmedia = 0xB2
playpause = 0xB3
launchmail = 0xB4
selectmedia = 0xB5
launchapp1 = 0xB6
launchapp2 = 0xB7
semicolon = 0xBA
equals = 0xBB
comma = 0xBC
dash = 0xBD
period = 0xBE
slash = 0xBF
accent = 0xC0
openingsquarebracket = 0xDB
backslash = 0xDC
closingsquarebracket = 0xDD
quote = 0xDE
play = 0xFA
zoom = 0xFB
PA1 = 0xFD
clear = 0xFE


#--- Keyboard Control Functions ---#


# Category variables
letters = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
shiftsymbols = "~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?"


# Presses and releases the key
def press(key):
user32.keybd_event(key, 0, 0, 0)
sleep(delay)
user32.keybd_event(key, 0, 2, 0)
sleep(delay)


# Holds a key
def hold(key):
user32.keybd_event(key, 0, 0, 0)
sleep(delay)


# Releases a key
def release(key):
user32.keybd_event(key, 0, 2, 0)
sleep(delay)


# Types out a string
def typestr(sentence):
for letter in sentence:
shift = letter in shiftsymbols
fixedletter = "space"
if letter == "`" or letter == "~":
fixedletter = "accent"
elif letter == "1" or letter == "!":
fixedletter = "num1"
elif letter == "2" or letter == "@":
fixedletter = "num2"
elif letter == "3" or letter == "#":
fixedletter = "num3"
elif letter == "4" or letter == "$":
fixedletter = "num4"
elif letter == "5" or letter == "%":
fixedletter = "num5"
elif letter == "6" or letter == "^":
fixedletter = "num6"
elif letter == "7" or letter == "&":
fixedletter = "num7"
elif letter == "8" or letter == "*":
fixedletter = "num8"
elif letter == "9" or letter == "(":
fixedletter = "num9"
elif letter == "0" or letter == ")":
fixedletter = "num0"
elif letter == "-" or letter == "_":
fixedletter = "dash"
elif letter == "=" or letter == "+":
fixedletter = "equals"
elif letter in letters:
fixedletter = letter.lower()
elif letter == "[" or letter == "{":
fixedletter = "openingsquarebracket"
elif letter == "]" or letter == "}":
fixedletter = "closingsquarebracket"
elif letter == "\\" or letter == "|":
fixedletter == "backslash"
elif letter == ";" or letter == ":":
fixedletter = "semicolon"
elif letter == "'" or letter == "\"":
fixedletter = "quote"
elif letter == "," or letter == "<":
fixedletter = "comma"
elif letter == "." or letter == ">":
fixedletter = "period"
elif letter == "/" or letter == "?":
fixedletter = "slash"
elif letter == "\n":
fixedletter = "enter"
keytopress = eval("key." + str(fixedletter))
if shift:
hold(key.shift)
press(keytopress)
release(key.shift)
else:
press(keytopress)


#--- Mouse Variables ---#
                        

class mouse:
left = [0x0002, 0x0004]
right = [0x0008, 0x00010]
middle = [0x00020, 0x00040]


#--- Mouse Control Functions ---#


# Moves mouse to a position
def move(x, y):
user32.SetCursorPos(x, y)


# Presses and releases mouse
def click(button):
user32.mouse_event(button[0], 0, 0, 0, 0)
sleep(delay)
user32.mouse_event(button[1], 0, 0, 0, 0)
sleep(delay)


# Holds a mouse button
def holdclick(button):
user32.mouse_event(button[0], 0, 0, 0, 0)
sleep(delay)


# Releases a mouse button
def releaseclick(button):
user32.mouse_event(button[1])
sleep(delay)

我试过 lib keyboard,它在 Windows、 Mac 和 Linux 上都很好用。下面一行帮助我在浏览器中切换标签:

keyboard.press_and_release('ctrl+tab')
    

关于推荐答案的代码,

对于我的机器人,推荐的答案不起作用。这是因为我正在使用 Chrome,它要求我在 dwFlags 中使用 KEYEVENTF _ SCANCODE。

为了让他的代码起作用,我不得不修改这些代码块:

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:l
#self.wScan = user32.MapVirtualKeyExW(self.wVk,
#MAPVK_VK_TO_VSC, 0)
# ^MAKE SURE YOU COMMENT/REMOVE THIS CODE^


def PressKey(keyCode):
input = INPUT(type=INPUT_KEYBOARD,
ki=KEYBDINPUT(wScan=keyCode,
dwFlags=KEYEVENTF_SCANCODE))
user32.SendInput(1, ctypes.byref(input), ctypes.sizeof(input))


def ReleaseKey(keyCode):
input = INPUT(type=INPUT_KEYBOARD,
ki=KEYBDINPUT(wScan=keyCode,
dwFlags=KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP))
user32.SendInput(1, ctypes.byref(input), ctypes.sizeof(input))


time.sleep(5) # sleep to open browser tab
PressKey(0x26) # press right arrow key
time.sleep(2) # hold for 2 seconds
ReleaseKey(0x26) # release right arrow key


我希望这能帮助某人减轻头痛!

    def keyboardevent():
keyboard.press_and_release('a')
keyboard.press_and_release('shift + b')
         

keyboardevent()
import ctypes
user32 = ctypes.WinDLL('user32')


class KBDIN(ctypes.Structure): _fields_ = (("wVk", ctypes.c_ushort),("dwFlags", ctypes.c_ulong),("dwExtraInfo", ctypes.c_ulonglong))
class INPUT(ctypes.Structure): _fields_ = (("type", ctypes.c_ulong),("ki", KBDIN),("padding", ctypes.c_ubyte * 8))


def Press(key_code):   user32.SendInput(1, ctypes.byref(INPUT(type=1, ki=KBDIN(wVk=key_code))), 40)
def Release(key_code): user32.SendInput(1, ctypes.byref(INPUT(type=1, ki=KBDIN(wVk=key_code, dwFlags=2))), 40)

虚拟密钥代码