简短的摘要:
我正在尝试创建一个程序,将键盘事件发送到计算机,为了所有目的,模拟事件应被视为键盘上的实际击键.
原帖:
我正在寻找一种使用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
Run Code Online (Sandbox Code Playgroud)
以上显然是示例,但我正在寻找的是库,模块或其他,我可以用它来模拟键盘事件.
注意:这与将字符发送到记事本,或将文本输入字段等不同.我希望python脚本模拟一个实际的键盘事件,计算机会认为确实存在键盘事件.
额外注意:
我不想将键击发送到活动窗口 - 我希望系统能够相信键盘的按键被按下,微妙的区别,因为一些活动窗口不接受某些键组合,或者我想使用键盘快捷键对于通过我的脚本的后台进程,他们不需要通过活动窗口
到目前为止,我已经看过这些事情:
这些都是关于苹果的,并没有任何帮助.
还有这个:
这似乎可能是我需要的,但我找不到它的库或任何文档.
我也搜索了更多的地方,但还没有找到解决方案.
我需要在 Mac 和 Windows 上为 python 3 提供定时输入,如果用户没有时间,它会自动选择其中一个选项。我见过的问题的所有其他答案只有在用户按“Enter”键后才会终止。无论是否按下“Enter”键,我都需要它终止。
例如,在我的国际象棋程序中,如果5秒后没有输入,我需要它自动选择“Q”。另外,如果输入不在 [“Q”,“R”,“B”,“N”] 中,那么我还需要它来选择“Q”。
下面的代码不起作用。它会要求输入然后永远等待;计时器根本不工作。
def countdown():
global timer
timer = 5
for x in range(timer):
timer -= 1
time.sleep(1)
countdownThread = threading.Thread(target=countdown)
countdownThread.start()
while timer > 0:
promotedPiece = input("Promote to Q, R, B or N? > ").upper()
if timer == 0:
break
if timer == 0:
if promotedPiece not in ["Q", "R", "B", "N"]: # If not valid input, choose Queen
promotedPiece = "Q"
print("Queen auto selected")
Run Code Online (Sandbox Code Playgroud) python multithreading timer python-multithreading python-3.x
我会尝试发布一个最小的工作示例,但不幸的是这个问题只需要很多部分,所以我尽可能地将其剥离.
首先,我使用一个简单的脚本来模拟通过函数调用按键.这是从这里调整的.
import ctypes
SendInput = ctypes.windll.user32.SendInput
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
_fields_ = [("wVk", ctypes.c_ushort),
("wScan", ctypes.c_ushort),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", PUL)]
class HardwareInput(ctypes.Structure):
_fields_ = [("uMsg", ctypes.c_ulong),
("wParamL", ctypes.c_short),
("wParamH", ctypes.c_ushort)]
class MouseInput(ctypes.Structure):
_fields_ = [("dx", ctypes.c_long),
("dy", ctypes.c_long),
("mouseData", ctypes.c_ulong),
("dwFlags", ctypes.c_ulong),
("time",ctypes.c_ulong),
("dwExtraInfo", PUL)]
class Input_I(ctypes.Union):
_fields_ = [("ki", KeyBdInput),
("mi", MouseInput),
("hi", HardwareInput)]
class Input(ctypes.Structure):
_fields_ = [("type", ctypes.c_ulong),
("ii", Input_I)]
def getKeyCode(unicodeKey):
k = unicodeKey
curKeyCode = 0
if k == …Run Code Online (Sandbox Code Playgroud) python windows keyboard multithreading python-multithreading