在Python中模拟按键

2024-06-05

好吧,我知道这个问题看起来像重复的,但我不认为它是重复的。我读过其他关于假按键的文章,其中涉及 ctypes 和 SendKey。然而,我已经尝试过这些,但它们并不像我想要的那样工作。我不想要与实际击键类似的东西,我想要与击键完全相同的东西。我用 ctypes 运行了一些测试,我注意到按键的行为与真正的击键不同。

例如,如果我打开记事本并按住 A 键,我会得到一个 A 字符,大约一秒钟后它开始填充 As。当我为 A 运行 PressKey() 时,它会键入一个 A,仅此而已。我仍然必须在 A 之后运行 ReleaseKey(),这样其他程序就不会混乱。

我需要某种方法来执行 realKeyPress('A') 之类的操作,并让它的行为与我按下 A 键完全相同。另外,谢谢大家,你们总是这么快就给出了很好的答案!


所以我还是用了ctypes。在阅读了与本主题类似的另一个答案后,我修改了 ctypes 代码。这是完成的代码:

import ctypes
import time

SendInput = ctypes.windll.user32.SendInput

# C struct redefinitions 
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)]

# Actuals Functions

def PressKey(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

def ReleaseKey(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中模拟按键 的相关文章

随机推荐

  • 有没有办法让 C# 类处理自己的空引用异常

    Question 我想要一个能够处理自身空引用的类 我怎样才能做到这一点 扩展方法是我能想到的唯一方法 但我想我会问一下 以防有一些关于 C 的有趣的事情我不知道 Example 我有一堂课叫User有一个名为IsAuthorized Wh
  • C# 代码在 IIS 上运行速度快,但在 Mono 上运行速度慢 - 如何改进?

    我有一个 ASP NET 应用程序 它在我的 Windows 开发计算机上运行良好 不过 服务器是运行 Mono 的 Linux 一旦上传 相同的代码在 Windows 上的运行速度会比在 Windows 机器上慢 4 到 5 倍 例如 一
  • 如何自定义ActionBar上的后退按钮

    我已经能够使用以下建议自定义操作栏的背景 徽标图像和文本颜色 Android 如何将 ActionBar Home 图标更改为应用程序图标以外的其他图标 https stackoverflow com questions 6351479 a
  • 会话超时(session.setMaxInactiveInterval)在 Google Appengine 中不起作用

    我尝试使用以下命令为特定用户设置会话超时session setMaxInactiveInterval 30 60 30分钟 但默认情况下它被分配为 86400 秒 24 小时 也在 Web xml 中尝试过
  • 如何在opengl中使用四元数绕屏幕中心旋转?

    我正在尝试实现轨迹球 轨迹球旋转 但我的中心有问题 回转 无论如何 我希望中心成为屏幕的中心 让我解释一下到目前为止我所做的事情 我创建了一个四元数 旋转轴 向量起点x向量结束 角度 向量起点 向量结束 从该四元数中 我创建了一个旋转矩阵
  • Camera.takePicture 返回旋转的 byteArray

    我正在尝试使用制作自定义相机应用程序hardware camera 我已经实现了PictureCallback拍照时会写入指定路径的文件中 这data写入文件的是ByteArray由返回takePicture在相机 API 中 因此 在写入
  • contenteditable div 中的内容为空

    我有一个 contenteditable div 充当文本区域 div class post div 如何通过 JS JQuery 清空 div 以清除所有值 我试过了 post html 但它不能正常工作 请帮忙 post empty d
  • Sierra 更新后无法针对 iOS 10 进行编译

    我有一个今年八月生成的证书和配置文件 它们在 Apple 开发者门户中均有效 未过期 当我打开以 8 3 为目标的项目时 出现以下错误 No certificate matching iPhone Developer My Name ABC
  • SQL Server - 即使在回滚的情况下如何确保标识字段正确增加

    在 SQL Server 中 如果涉及插入新行的事务被回滚 则标识字段中的数字将被跳过 例如 如果Foos表是99 然后我们尝试插入一个新的Foo记录但回滚 然后 ID 100 被 用完 下一个Foo行编号为 101 有什么方法可以改变这种
  • 如何在 Rails ActiveRecord 中的日期指定小于今天的条件

    我正在尝试找出如何提取我的集合中的所有记录的字段publish是真的并且expires比今天少 我有以下内容 但我认为小于部分不起作用 有人可以指出我正确的轨道吗 Announcement where publish true expire
  • mongodb 无法在 ubuntu 18.04 上启动

    我在 Windows 10 上运行 ubuntu 18 04 我在 cli 上运行 mongod mongodb 正常启动 然后我尝试运行 mongo 并收到此错误 MongoDB shell version v4 0 2 connecti
  • DOM 节点上的事件处理程序是否会随节点一起删除?

    注意 下面我使用的是 jQuery 但问题实际上是一个通用的 JavaScript 问题 说我有一个div formsection其内容使用 AJAX 反复更新 如下所示 var formSection div formsection va
  • 更改特定元素的滚动速度[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 好吧 我不知道如何编写脚本 但是在
  • XSLT 用逗号 (,) 连接值

    我需要循环遍历xml文档中的所有节点 并在值后面附加逗号 最后 在最后一个元素之后我不应该有逗号 有谁能够帮助我 感谢您 拉马纳 库马尔 你可以这样做
  • Java 中用零进行右填充

    抱歉 如果这个问题已经提出 我已经进行了深入的搜索 但一无所获 现在 我知道 String format 05d price 将在左侧用零填充我的价格 因此价格为 25 将导致00025 如果我想将它们填充到右侧怎么办 所以结果是25000
  • 如何防止我的客户经常使用演示 Java 程序?

    我制作了一个演示小程序 想交付给我的客户 以便他可以运行它 5 次以检查其功能 它不是一个大软件 我为其实现了一些序列密钥功能并制作了试用软件 我想要一个简单的解决方案 可以限制程序的使用超过 5 次 或者可以在达到阈值限制后自行删除 我想
  • 如何在 YAML 文件中为简单的 POJO 定义映射?

    我在用蛇YAML https bitbucket org snakeyaml snakeyaml将某些配置 属性值解析为配置对象 下面定义 我的 YAML 文件如下所示 Thread batchLimit 1000 threadCountL
  • 如何将 AdMob 广告添加到 UITableView

    我正在尝试将 AdMob 广告添加到表格视图中 我希望它出现在每 10 个单元格中 例如 如果您有 Reddit 应用程序的免费版本 就像它一样 我尝试遵循 AdMob 文档 但没有任何运气 而且我确信我遗漏了一些东西 任何人都可以阐明一种
  • Angular 4 在 APP_INITIALIZER 中注入路由

    我正在尝试检索 APP INITIALIZER 中 url 中存在的数据 应用程序模块 ts export function init config ConfigService router Router return gt config
  • 在Python中模拟按键

    好吧 我知道这个问题看起来像重复的 但我不认为它是重复的 我读过其他关于假按键的文章 其中涉及 ctypes 和 SendKey 然而 我已经尝试过这些 但它们并不像我想要的那样工作 我不想要与实际击键类似的东西 我想要与击键完全相同的东西