如何在Python中生成键盘事件?

简短的摘要:

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

原始帖子:

我正在寻找一种使用python生成键盘事件的方法。

假定该函数收到一个必须模拟按下的键,如下所示:

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

上面显然是示例,但是我要寻找的是库,模块或其他任何可用来模拟键盘事件的库。

注意:这不同于将字符发送到记事本,或在字段等中输入文本。我希望python脚本模拟实际的键盘事件,计算机会认为确实存在键盘事件。

特别提示:

我不想将击键发送到活动窗口-我希望系统相信键盘的键被按下,这是细微的差别,因为某些活动窗口不接受某些键组合,或者我想使用键盘快捷键对于通过我的脚本进行的后台进程,它们不需要通过活动窗口

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

为最前端的应用程序生成键盘事件

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

都是关于苹果的,根本没有帮助。

还有这个:

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

似乎可能是我需要的,但是我找不到该库或任何文档。

我也搜索了更多地方,但尚未找到解决方案。

回答:

可以使用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是Windows API定义的虚拟键盘映射。代码列表在MSDN上可用:虚拟键代码(Windows)

以上是 如何在Python中生成键盘事件? 的全部内容, 来源链接: utcz.com/qa/429795.html

回到顶部