基本思路 由于python是解释型程序 所以在使用Windows的一部分带有结构参数的api函数时 需要提前分配内存,此时我想到的方法是给变量分配二进制数b'000000000',最好多输入些0 以便能保存更多的结果。 下面例子是研究返回当前鼠标的坐标点 由于该api函数需要一个保存点的结构,但是在python中目前还没发现结构类型变量 因为是解释型语言 因此我定义一个初始化的变量cc,初始值为b'0000000000000000000000000',我调用user32.dll中的GetCursorPos()函数时,将其返回结果存入结构参数cc,同时我要检测函数是否执行成功,调用detector=win32api.GetLastError(上一次函数的返回码),返回值detector为0表示操作成功,下面我们执行下面的程序 分析输出结果:
import ctypes from ctypes import cdll from platform import * import win32gui, win32api, win32con #分配初始内存,以便保存GetCursorPos(cc)结构参数返回的结果 cc=b'0000000000000000000000000' #加载32位的dll,因为我的python版本时32版本的,Win10的64位操作系统需要位于sysWow64下32位版本的#user32.dll clib1 = cdll.LoadLibrary('user32.dll') successNumber=clib1.GetCursorPos(cc) detector=win32api.GetLastError(successNumber) print("函数是否执行成功,返回错误编号,正确执行返回编号0:",detector) validPos=win32api.GetCursorPos() print("验证当前坐标:",validPos) print("研究返回的坐标:",cc) print("api函数是否执行成功,成功返回非零,失败返回0:",successNumber) print("错误检测函数,操作成功返回0,失败返回错误编号:",detector)
输出结果,如果没有可显示字符 使用\x的形式,否则使用字符的ASCII码:
函数是否执行成功,返回错误编号,正确执行返回编号0: 0
验证当前坐标: (926, 593)
研究返回的坐标: b'\x9e\x03\x00\x00Q\x02\x00\x0000000000000000000'
api函数是否执行成功,成功返回非零,失败返回0: 1
错误检测函数,操作成功返回0,失败返回错误编号: 0
分析:
我们得到的返回值是 b'\x9e\x03\x00\x00Q\x02\x00\x0000000000000000000',其为16进制,由于我的是Intel处理器 属于小端编码 所以上面的结果正确读取应该是039e 0000 02Q 0000
十六进制039e==十进制926 返回正确
中间的\x00\x00最初我不知道是什么 但通过分析\x02Q发现 因为Q的ASCII码十进制是81,转为十六进制为\x51 而十六进制\x0251就是验证的十进制坐标593,至此 分析完成,以下验证图片