python 下Windows api函数的研究

基本思路 由于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,至此 分析完成,以下验证图片

相关推荐

  1. Python函数参数

    2023-12-08 20:50:02       62 阅读
  2. Python——函数介绍

    2023-12-08 20:50:02       54 阅读
  3. Python函数

    2023-12-08 20:50:02       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 20:50:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 20:50:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 20:50:02       82 阅读
  4. Python语言-面向对象

    2023-12-08 20:50:02       91 阅读

热门阅读

  1. 做题笔记:SQL Sever 方式做牛客SQL的题目--VQ34

    2023-12-08 20:50:02       55 阅读
  2. 面试经典150题(1-2)

    2023-12-08 20:50:02       59 阅读
  3. 如何在Go中编写Switch语句

    2023-12-08 20:50:02       55 阅读
  4. 基于Docker安装Mysql:5.5

    2023-12-08 20:50:02       43 阅读
  5. 如何使用JQUERY ..从URL获取域名和参数?

    2023-12-08 20:50:02       48 阅读
  6. 解析 DNS 域名:了解其结构与解析过程

    2023-12-08 20:50:02       51 阅读
  7. unity连接php+mysql(超级简易游戏注册功能)

    2023-12-08 20:50:02       44 阅读