Python 调用 Windows API COM 新法


Posted in Python onAugust 22, 2019

Python中调用Win32API 通常都是使用 PyWin32或者ctypes。但要么依赖文件较多,要么用法繁琐。

这里介绍在Python中调用Win32 API 或者COM组件的另一个更好的,功能也更强大的解决方案。

首先需要确保安装的是 32位的Python(2.x 或者 3.x 均可)。

下载通用库:win32exts for Python:

             https://github.com/tankaishuai/win32exts_for_Python

将win32exts.pyd 放入 Python/DLLs 目录下即可。发布时 仅有此一个文件而已。

import win32exts

win32exts调用的基本用法如下:

(1)常规具名函数(以MessageBoxA/W为例)调用:

首先需要导入模块符号。第一个参数为待加载的模块名,可以带路径,传入"*"表示当前进程的所有模块;

第二个参数表示函数符号名称,传入"*"表示该模块的所有符号。

win32exts.load_sym("*", "*")
或 win32exts.load_sym("C:\\windows\\system32\\user32.dll", "MessageBoxW")
或 win32exts.load_sym("user32", "MessageBoxA")
或 win32exts.load_sym("user32", "*")

然后:

win32exts.MessageBoxA(0, "call MessageBoxA", "", 1)

宽字符需要用 win32exts.L() 包装,与C/C++雷同。

win32exts.MessageBoxW(0, win32exts.L("call MessageBoxW"), None, 1)

(2)带回调的函数(以EnumWindows为例)调用:

先分配一块内存后面用:

g_buf = win32exts.malloc(2*260)

定义一个回调函数:

def EnumWndProc(args): 
  #【args为参数包,以下取参数】
  hWnd = win32exts.arg(args, 1)
  lParam = win32exts.arg(args, 2)
  win32exts.GetWindowTextW(hWnd, g_buf, 260)
  #【读取内存中的宽字符串】
  #【read_***系列接口读内存,write_***系列接口写内存】
  strText = win32exts.read_wstring(g_buf, 0, -1)
  win32exts.MessageBoxW(0, win32exts.L(strText), g_buf, 1)
  strRetVal = "1, 8"
  g_index = g_index + 1
  if g_index > 3: #【假设只弹框三次】
   strRetVal = "0, 8"
  #【返回值是形如这样的字符串: "回调返回值, 参数字节数",
  # 对于 cdecl 调用约定,参数字节数总是取 0 】
  return strRetVal

然后调用:

win32exts.EnumWindows(win32exts.callback("EnumWndProc"), 0)
win32exts.callback()用于包装一个Python回调函数。

(3)匿名(非具名)函数调用:

假设通过某个接口获取了某函数的地址 lFuncAddr,然后可以类似下述方式调用:

win32exts.push_value(arg1) 【参数是整数】
win32exts.push_wstring("arg2") 【参数是宽字符串】
win32exts.push_astring(arg3) 【参数是多字节字符串】
win32exts.push_double(arg4) 【参数是双精度浮点数】
win32exts.push_float(arg5) 【参数是单精度浮点数】
win32exts.push_function("FunctionName") 【参数是回调函数】

iRetVal = win32exts.call( lFuncAddr )

当然具名函数也可以类似调用,例如:

win32exts.push_value(0)
win32exts.push_astring("Py_MessageBoxA_V1")
win32exts.push_value(0)
win32exts.push_value(0)
iRetVal = win32exts.sym_call("MessageBoxA") #【或用 func_call】

(4)调用COM组件:

import win32exts
#
# 测试 COM 组件, 打开计算器
#
wsh = win32exts.co_create_ ("W .Shell")
win32exts.co_push_start()
win32exts.push_bstr("calc")
win32exts.co_invoke(wsh, "Run")
win32exts.co_release(wsh)

知识点扩展:

python调用windows api

import ctypes
# 方式一
ctypes.windll.user32.MessageBoxA(None, 'message', 'title', 0)
# 方式二
ctypes.WinDLL('user32.dll').MessageBoxA(None, 'message', 'title', 0)

总结

以上所述是小编给大家介绍的Python 调用 Windows API COM 新法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
给Python中的MySQLdb模块添加超时功能的教程
May 05 Python
Python操作csv文件实例详解
Jul 31 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
Dec 15 Python
Python走楼梯问题解决方法示例
Jul 25 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
Python面向对象之类和实例用法分析
Jun 08 Python
python add_argument()用法解析
Jan 29 Python
Python openpyxl 插入折线图实例
Apr 17 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
python mock测试的示例
Oct 19 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
Python 数据结构之十大经典排序算法一文通关
Oct 16 Python
详解Python文件修改的两种方式
Aug 22 #Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 #Python
python支付宝支付示例详解
Aug 22 #Python
关于python3中setup.py小概念解析
Aug 22 #Python
python3 requests库文件上传与下载实现详解
Aug 22 #Python
python3使用print打印带颜色的字符串代码实例
Aug 22 #Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 #Python
You might like
php4的session功能评述(二)
2006/10/09 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
php 猴子摘桃的算法
2017/06/20 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
对Python 内建函数和保留字详解
2018/10/15 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
简单了解python的一些位运算技巧
2019/07/13 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
Minikube搭建Kubernetes集群
2022/03/31 Servers
vue选项卡切换的实现案例
2022/04/11 Vue.js