Python中的按键敲击

42

有没有可能让系统看到一个按键被按下,例如我需要按下A按键数千次,手动操作非常耗时,我想编写一些程序来代替我的操作,而我唯一熟练的工具是Python。

更准确地说,我需要模拟按键按下,即不是捕获按键按下。

更多信息(如所请求): 我正在运行Windows XP,并需要将这些按键发送到另一个应用程序。


可能是可以的 - 但您想将按键输入发送到哪里?要发送到另一个应用程序吗?这可能涉及了解您的平台窗口工具包并向正确的窗口发送正确的消息。澄清您的要求,我相信我们可以帮助您解决问题。 - HenryR
11个回答

49

安装pywin32扩展。然后您可以执行以下操作:

import win32com.client as comclt
wsh= comclt.Dispatch("WScript.Shell")
wsh.AppActivate("Notepad") # select another application
wsh.SendKeys("a") # send the keys you want

搜索WScript.Shell对象的文档(我相信在所有Windows XP安装中都默认安装了该对象)。您可以从这里开始,也许可以找到相关信息。

编辑:发送F11

import win32com.client as comctl
wsh = comctl.Dispatch("WScript.Shell")

# Google Chrome window title
wsh.AppActivate("icanhazip.com")
wsh.SendKeys("{F11}")

1
这绝对是最好的答案。原因是什么?它不需要安装任何额外的包!最重要的是,它可以编译成EXE文件,并且没有问题,而“pynput”和“pyautogui”会产生问题。如果我能多次点赞你就好了! :) - Apostolos

47

你也可以使用PyAutoGui来发送虚拟按键。

这里是文档:https://pyautogui.readthedocs.org/en/latest/

import pyautogui


pyautogui.press('Any key combination')

您还可以使用以下代码发送键盘按键,例如Shift键或Enter键:

import pyautogui

pyautogui.press('shift')

pyautogui还可以直接发送文本,像这样:

import pyautogui

pyautogui.typewrite('any text you want to type')

如果按下"A"键1000次,它会看起来像这样:

import pyautogui

for i in range(999):
    pyautogui.press("a")

使用alt-tab或其他需要同时按下多个按键的任务:

import pyautogui

# Holds down the alt key
pyautogui.keyDown("alt")

# Presses the tab key once
pyautogui.press("tab")

# Lets go of the alt key
pyautogui.keyUp("alt")

2
太棒了,正是我所需要的...而且它还可以捕捉屏幕截图。 - Andrea Lazzarotto
提醒一下,这个模块依赖于 pyobjc,它有大量的依赖项。在安装时请注意。 - numbermaniac
我同意@numbermaniac的观点。例如,“py2exe”在使用此软件包将PY文件转换为EXE文件时存在问题,这很可能是由于大量依赖项。此外,有人必须安装一个额外的软件包,而最终结果可以通过Python附带的“win32com”(或主要软件包PyWin32)来实现。 - Apostolos

12

检查这个带有许多功能的键盘模块。安装它,可以使用以下命令:

pip3 install keyboard

然后使用这段代码:

import keyboard
keyboard.write('A',delay=0)

如果你想要多次输出字母'A',那么可以使用循环语句。
注意:
按下键盘上的字母'A'将会在整个窗口中生效。也就是说,当脚本运行时,你可以切换到浏览器界面,脚本会自动在其中输入字母'A'。

2
有没有一种方法可以使用这个库按住键盘按键数秒钟。我不想多次按键,只按住一次直到释放。我已经查看了API文档,但无法找到确切的内容 - 有许多关于按钮组合的东西。 - thomascrha
keyboard.press(hotkey)是怎样的呢?它可以"按下并按住一个热键",请参见:https://github.com/boppreh/keyboard#keyboardpresshotkey - dpat

11

AutoHotKey非常适合这种任务(键盘自动化/重新映射)。

发送"A"字符100次的脚本:

Send {A 100}

就这些。

编辑:将键发送给特定应用程序:

WinActivate Word
Send {A 100}

5
这个方法可行,但并没有回答问题,所以我会点赞,但不能把它作为答案接受。 - UnkwnTech

4

PyAutoGui还允许您多次按下按钮:

pyautogui.press('tab', presses=5)   # press TAB five times in a row

pyautogui.press('A', presses=1000)   # press A a thousand times in a row

3

在发送按键事件之前将首选窗口设置为前台的另一种方法。

hwnd = win32gui.FindWindowEx(0,0,0, "App title")
win32gui.SetForegroundWindow(hwnd)

3
如果你的平台是Windows,我不会真正推荐Python。相反,看看Autohotkey。相信我,我喜欢Python,但在这种情况下,宏程序是理想的工具。 Autohotkey的脚本只是尚可(在我看来),但模拟输入的简易性将为您节省无数小时。 Autohotkey脚本也可以“编译”,因此您不需要解释器来运行脚本。
此外,如果这是为Web上的某些内容,我建议使用iMacros。它是一个Firefox插件,因此与网站的集成更好。例如,您可以说“在此表单中写入1000个'a'”而不是“模拟在(319,400)处的鼠标点击,然后按下1000次'a'”。
对于Linux,我很遗憾没有找到一个好的方法来轻松创建键盘/鼠标宏。

3
import keyboard

keyboard.press_and_release('anykey')

1

有一个解决方案:

import pyautogui
for i in range(1000):
    pyautogui.typewrite("a")

0
你可以使用pyautogui模块来自动移动鼠标和按键。它也可以用于一些GUI(非常基础的)。 你可以这样做: import pyautogui pyautogui.press('A') # 按下'A'键
如果你想重复1000次,那么你可以使用while循环。
希望这对你有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接