如何使用 ctypes 将 SendInput 函数包装到 python

2023-11-29

我正在尝试使用 ctypes 从 user32.dll 获取 SendInput 函数以在 python 中工作。我是一个菜鸟,但从我从文档中读到的内容来看,您必须在 python 中创建函数所需的结构,然后将其传递给函数。

import ctypes
import keyboard
from ctypes import *
lib = windll.user32

KEYEVENTF_SCANCODE = 0x8
KEYEVENTF_KEYUP = 0x2
SPACEBAR = 57 # 0x39
INPUT_KEYBOARD = 1


class KEYBDINPUT(Structure):
    _fields_ = [('wVk' , c_ushort) , ('wScan' , c_ushort)
    , ('dwFlags' , c_ulong) , ('time' , c_ulong) , ('dwExtraInfo' , c_ulong)]
class INPUT(Structure):
    _fields_ = [('type' , c_ulong) ,('ki' , KEYBDINPUT)]


lib.SendInput.restype = c_uint
lib.SendInput.argtypes = [c_uint , INPUT , c_int]

keybdinput_obj = KEYBDINPUT(0 , SPACEBAR , KEYEVENTF_SCANCODE , 0 , 0)
input_obj = INPUT(INPUT_KEYBOARD , keybdinput_obj)
keyboard.wait('u')
lib.SendInput(1 , byref(input_obj) , sizeof(INPUT))
keybdinput_obj = KEYBDINPUT(0 , SPACEBAR , KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP , 0 , 0)
input_obj = INPUT(INPUT_KEYBOARD , keybdinput_obj)
lib.SendInput(1 , byref(input_obj) , sizeof(INPUT))

在微软文档中,我从 INPUT 结构引导自己有一个联合,但我想如果我只需要 KEYBDINPUT 那么它就像我有一个联合一样。

https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-input

https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-keybdinput

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput

我几乎陷入困境,因为我看不出这里出了什么问题,所以我寻求帮助。程序应该在我按键盘上的“u”后发送一个空格(这是为了调试目的),我这样做了这样是因为我希望它作为扫描码而不是虚拟按键发送。

因此,如果 python 中有另一种可以发送扫描代码的方法,那会起作用,我将非常感激。


定义整个联合体,或者至少定义 MOUSEINPUT,它是联合体中最大的成员。您可以通过 print(sizeof(INPUT)) 测试您的定义是否正确,并且它应该与 C 程序中打印 INPUT 结构的大小一致。我得到的 32 位 C 结构的大小为 28,64 位 C 结构的大小为 40。

另外,SendInput 的第二个参数是 POINTER(INPUT),而不是 INPUT,并且 ULONG_PTR 不一定c_ulong因为它取决于运行 32 位或 64 位 Python。

这是一个经过测试的示例:

import ctypes
from ctypes import *
from ctypes import wintypes as w

KEYEVENTF_SCANCODE = 0x8
KEYEVENTF_UNICODE = 0x4
KEYEVENTF_KEYUP = 0x2
SPACE = 0x39
INPUT_KEYBOARD = 1

# not defined by wintypes
ULONG_PTR = c_ulong if sizeof(c_void_p) == 4 else c_ulonglong

class KEYBDINPUT(Structure):
    _fields_ = [('wVk' ,w.WORD),
                ('wScan',w.WORD),
                ('dwFlags',w.DWORD),
                ('time',w.DWORD),
                ('dwExtraInfo',ULONG_PTR)]

class MOUSEINPUT(Structure):
    _fields_ = [('dx' ,w.LONG),
                ('dy',w.LONG),
                ('mouseData',w.DWORD),
                ('dwFlags',w.DWORD),
                ('time',w.DWORD),
                ('dwExtraInfo',ULONG_PTR)]

class HARDWAREINPUT(Structure):
    _fields_ = [('uMsg' ,w.DWORD),
                ('wParamL',w.WORD),
                ('wParamH',w.WORD)]

class DUMMYUNIONNAME(Union):
    _fields_ = [('mi',MOUSEINPUT),
                ('ki',KEYBDINPUT),
                ('hi',HARDWAREINPUT)] 

class INPUT(Structure):
    _anonymous_ = ['u']
    _fields_ = [('type',w.DWORD),
                ('u',DUMMYUNIONNAME)]

print(sizeof(INPUT))

lib = WinDLL('user32')
lib.SendInput.argtypes = w.UINT,POINTER(INPUT),c_int
lib.SendInput.restype = w.UINT

def send_scancode(code):
    i = INPUT()
    i.type = INPUT_KEYBOARD
    i.ki = KEYBDINPUT(0,code,KEYEVENTF_SCANCODE,0,0)
    lib.SendInput(1,byref(i),sizeof(INPUT))
    i.ki.dwFlags |= KEYEVENTF_KEYUP
    lib.SendInput(1,byref(i),sizeof(INPUT))

def send_unicode(s):
    i = INPUT()
    i.type = INPUT_KEYBOARD
    for c in s:
        i.ki = KEYBDINPUT(0,ord(c),KEYEVENTF_UNICODE,0,0)
        lib.SendInput(1,byref(i),sizeof(INPUT))
        i.ki.dwFlags |= KEYEVENTF_KEYUP
        lib.SendInput(1,byref(i),sizeof(INPUT))

send_scancode(SPACE)
send_unicode('The quick brown fox jumped over the lazy dog')

运行 64 位 Python 3.6 的终端上的输出:

C:\>example
40

C:\> The quick brown fox jumped over the lazy dog
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ctypes 将 SendInput 函数包装到 python 的相关文章

  • 如何查找 pandas 数据框中连续相同字符串值的计数?

    假设我们有以下 pandas 数据框 df pd DataFrame col1 A gt G C gt T C gt T G gt T C gt T A gt G A gt G A gt G col2 TCT ACA TCA TCA GCT
  • Python:多处理和请求

    以下是我正在运行的使用多处理并行触发 HTTP 请求的代码片段 在控制台上运行后 它挂在 requests get url 处 既不继续前进也不抛出错误 def echo 100 q print before r requests get
  • 按 ListProperty (NDB) 对查询进行排序

    如何按 ListProperty 对查询进行排序 该模型 class Chapter ndb Model title ndb StringProperty required True version ndb IntegerProperty
  • Python中#和"""注释的区别

    开始用 Python 编程 我看到一些带有注释的脚本 and comments 这两种评论方式有什么区别 最好的事情就是阅读PEP 8 Python 代码风格指南 https www python org dev peps pep 0008
  • 使用 python 通过搜索端点从 Spotify API 获取曲目

    因此 我尝试使用 API 的搜索端点进行搜索 从而从 Spotify API 获取曲目 请参阅文档 https developer spotify com documentation web api reference search sea
  • 垂直线 axvline 在 matplotlib 的 loglog 图中绘制位于错误位置的线

    我在使用 axvline 在 matplotlib 的 loglog 图中绘制垂直线时遇到问题 第一个问题是垂直线没有出现在正确的位置 第二个问题 可能相关的是 当我放大或平移绘图时 垂直线只是保持在原位 并且没有通过平移 滑动绘图 或放大
  • 在 Python 中比较日期 - 如何处理时区修饰符

    我正在做Python日期比较 假设我有一个这样的约会 Fri Aug 17 12 34 00 2012 0000 我按以下方式解析它 dt datetime strptime Fri Aug 17 12 34 00 2012 0000 a
  • 代理阻止网络套接字?如何绕行

    我有一个用 Python 编写的正在运行的 websocket 服务器 来自https github com opiate SimpleWebSocketServer https github com opiate SimpleWebSoc
  • Python 3.x 中的 PIL ImageTk 等效项

    我正在使用 Tkinter 开发一个应用程序 它使用以下数据库png图标的图像文件 为了在应用程序中使用所述图像 我使用 PIL 打开它们Image open 运行它通过ImageTk PhotoImage函数 然后将其传递给小部件构造函数
  • Python3模拟用另一个函数替换函数

    如何使用 python 中的另一个函数来模拟一个函数 该函数也将提供一个模拟对象 我有类似以下操作的代码 def foo arg1 arg2 r bar arg1 does interesting things 我想替换的实现bar函数 让
  • Python NLP 英式英语与美式英语

    我目前正在用Python 进行NLP 工作 然而 在我的语料库中 既有英式英语也有美式英语 实现 实现 我正在考虑将英式英语转换为美式英语 但是 我没有找到一个好的工具 包来做到这一点 有什么建议么 我也找不到包 但试试这个 请注意 我必须
  • 将 ASCII 字符转换为“”unicode 表示法的脚本

    我正在对 Linux 区域设置文件进行一些更改 usr share i18n locales like pt BR 并且需要格式化字符串 例如 d m Y H M 必须以 Unicode 指定 其中每个 在本例中为 ASCII 字符表示为
  • 写入 UDP 套接字会被阻塞吗?

    如果是的话 在什么条件下 或者 换句话说 在twisted 中运行此代码是否安全 class StatsdClient AbstractStatsdClient def init self host port super StatsdCli
  • 如何使用 python-gnupg 加密大型数据集而不占用所有内存?

    我的磁盘上有一个非常大的文本文件 假设它是 1 GB 或更多 还假设该文件中的数据有 n每 120 个字符一个字符 我在用python gnupg https pythonhosted org python gnupg 对此文件进行加密 由
  • 通过套接字发送字符串(python)

    我有两个脚本 Server py 和 Client py 我心中有两个目标 能够从客户端一次又一次地向服务器发送数据 能够将数据从服务器发送到客户端 这是我的 Server py import socket serversocket soc
  • 如何在 Pandas 数据框中用 NaN 替换一系列值?

    我有一个巨大的数据框 我应该如何用 NaN 替换一系列值 200 100 数据框 您可以使用pd DataFrame mask https pandas pydata org pandas docs stable generated pan
  • 升级后 pip 损坏

    我做了 pip install U easyinstall 然后 pip install U pip 来升级我的 pip 但是 当我尝试使用 pip 时 我现在收到此错误 root d8fb98fc3a66 which pip usr lo
  • 如何指定一个变量作为类或类实例的成员变量?

    在最新的 Python 2 7 x 中 给定类定义内的任何成员变量 该成员变量是否始终处于类级别 因为它是由该类的所有实例共享的单个变量 在类的定义中 如何指定 类定义中的哪些成员变量属于该类 因此由该类的所有实例共享 以及 哪些属于该类的
  • 提供节点名或服务名,或未知

    我收到这个 Python 错误 File Library Frameworks Python framework Versions 2 7 lib python2 7 urllib2 py line 1184 in do open rais
  • 获取长度为 n 的所有(n-选择-k)组合

    我怎样才能获得长度的所有组合 按顺序 n从数字列表中 例如 给定列表 1 2 3 4 并设置n 3 我怎样才能得到这些结果 1 2 3 1 2 4 1 3 4 2 3 4 For combinations of all possible l

随机推荐

  • Spring 3.1中可以和@Configuration结合使用吗

    我从 Spring 3 0 5 迁移到 3 1 因为我需要自定义 RequestMappingHandlerMapping 我在扩展 RequestMappingHandlerMapping 插件中遇到问题 我有现有的 servlet co
  • 定义一个新句柄(类似于STDOUT)

    当我注意到这一点时 我正在查看批量重定向句柄 这里是link 它提到句柄 3 9 未定义 可以由程序定义 现在我已经阅读了有关在 C 中执行此操作的信息 但我想知道这在 cmd batch 中是否可能 如果可以 它的限制 用途是什么 如果在
  • Gulp 似乎找不到指南针 mixins

    我正在尝试使用 gulp 作为 Grunt 的替代构建工具 将我的 scss 编译为 css 因为我听说它可以更快 我什至在对 scss 文件进行基本编译时都遇到问题 我尝试过使用gulp sass gulp ruby sass and g
  • Group By 子句中的无效列名错误

    我正在尝试为 rdlc 报告创建 Sp 其中我使用许多用户定义的函数进行计算 但是当我尝试在 group by 子句中使用函数别名时 会出现错误 Msg 207 Level 16 State 1 Line 14 无效的列名 CommPaid
  • 程序没有做它应该做的事 - C

    我编写了一个程序 从用户接收一系列数字 用户必须输入升序的数字 可以是4ex 1 2 2 3 7 8 0 并以 0 结尾 当然 如果没有 则会出现相应的错误消息 并且程序将关闭 我们可以确定用户会保留 Y 数组将是 如果 X 数组一切顺利的
  • 为什么两个字符串对象引用的串联不等于相同内容的字符串对象[重复]

    这个问题在这里已经有答案了 为什么下面s3 and s5 String对象不同 当s5尝试在字符串池中创建它检查内容s3已经有相同的内容了s5 refers s3字符串池中的对象 但我的假设是错误的 那么任何人都可以纠正我 String s
  • 如何修复使用 Api 时未按请求设置 Laravel 会话存储

    早些时候我尝试过这种方法堆栈溢出帖子但它在本地给出了 419 问题 api gt do not resolve Session store not set on request issue register user App Http Mi
  • Monotouch + UIWebView = 随机崩溃

    我在 iOS 5 0 iPhone 和 iPad 上使用 Mono Monotouch MonoDevelop 的最新稳定版本 我有一个 UIWebView 在模拟器中永远不会崩溃 但是在实际设备上它会随机崩溃在 EXC BAD ACCES
  • AWS::S3::Bucket:Class 的未定义方法“find”

    我正在为我的 Rails 项目实现 Amazon S3 上传器 我正在尝试访问一个存储桶 以便我可以将所有图像分配给一个变量并列出它们 当我尝试在上传控制器中查看新操作时 不断收到以下错误 undefined method find for
  • iOS UIView 旋转后获取框架

    我正在尝试获取我的尺寸UIView方向改变后 在我的视图控制器中我实现didRotateFromInterfaceOrientation 并打电话setNeedsLayout 在我看来 在我看来layoutSubviews方法中 它尝试根据
  • 用换行符分割字符串[重复]

    这个问题在这里已经有答案了 我正在尝试分割此文件中的行eng pol txt通过新行符号 n 它根本不起作用 我已经尝试过 String words strLine split n System out println Arrays toS
  • 重命名后应用存储后如何从 git“由我们添加”冲突中恢复

    我不记得我的 git local repo 是如何进入这种状态的 但情况是这样的 我在命令行上的状态显示 无需提交任何内容 工作树干净 git stash show p stash 0 显示了一些变化的差异 当我随意滚动时 并没有真正理解
  • /var/log/daemon.log 占用更多空间如何减少?

    下面是文件 rw r 1 root adm 4 4G Mar 6 09 04 daemon log rw r 1 root adm 6 2G Mar 1 06 26 daemon log 1 rw r 1 root adm 50M Feb
  • 使用scanf读取多行输入

    为班级编写程序 仅限于 scanf 方法 程序接收可以接收任意数量的行作为输入 使用 scanf 接收多行输入时出现问题 include
  • 如何根据空手道中的过滤器从 jsonarray 中删除对象

    我想根据过滤器从 json 数组中删除一个对象 尝试了下面的代码但没有成功 def json id 0a7936ed code test label test type sell id 7bc1909b2 code test2 label
  • NSTimer 精度

    我目前正在开发一个应用程序 该应用程序需要以精确的时间间隔播放声音文件 该时间间隔的持续时间是可变的 我似乎记得有人告诉 NSTimer 只是在指定的持续时间后将操作放入堆栈 而不是在指定的持续时间后运行操作 这意味着如果在它之前堆栈上有很
  • DBD::CSV 和占位符

    usr bin env perl use warnings use strict use DBI my dbh DBI gt connect DBI CSV RaiseError gt 1 or die DBI gt errstr my t
  • 访问被拒绝(“java.lang.RuntimePermission”“modifyThreadGroup”)

    我正在使用 Google App Engine 和 Google Cloud SQL 开发服务器应用程序 在本地计算机上运行服务器时尝试连接到 Cloud SQL 时遇到问题 我收到错误 java security AccessContro
  • Java过滤器无限循环[重复]

    这个问题在这里已经有答案了 我想实现一个过滤器来进行身份验证 但不知何故它陷入了无限循环 任何想法表示赞赏 HttpServletRequest httpRequest HttpServletRequest request HttpServ
  • 如何使用 ctypes 将 SendInput 函数包装到 python

    我正在尝试使用 ctypes 从 user32 dll 获取 SendInput 函数以在 python 中工作 我是一个菜鸟 但从我从文档中读到的内容来看 您必须在 python 中创建函数所需的结构 然后将其传递给函数 import c