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编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
在Python中输入一个以空格为间隔的数组方法
Nov 13 Python
对python:threading.Thread类的使用方法详解
Jan 31 Python
django 类视图的使用方法详解
Jul 24 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
Django ORM filter() 的运用详解
May 14 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
Python爬虫爬取微信朋友圈
Aug 06 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 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
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
python 自动提交和抓取网页
2009/07/13 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
HTML5实现签到 功能
2018/10/09 HTML / CSS
英国最大的海报商店:GB Posters
2018/03/20 全球购物
C语言如何决定使用那种整数类型
2016/11/26 面试题
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
专科毕业生自我鉴定
2013/12/01 职场文书
超越自我演讲稿
2014/05/21 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
大学生自我评价范文
2015/03/03 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
奠基仪式致辞
2015/07/30 职场文书
停车场管理制度范本
2015/08/05 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
一篇文章带你掌握SQLite3基本用法
2022/06/14 数据库