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在linux中输出带颜色的文字的方法
Jun 19 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
Python之reload流程实例代码解析
Jan 29 Python
python 对给定可迭代集合统计出现频率,并排序的方法
Oct 18 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
Nov 14 Python
详解opencv Python特征检测及K-最近邻匹配
Jan 21 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 Python
python中time tzset()函数实例用法
Feb 18 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下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
Python版的文曲星猜数字游戏代码
2013/09/02 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
django2笔记之路由path语法的实现
2019/07/17 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
主治医师岗位职责
2013/12/10 职场文书
业务副厂长岗位职责
2014/01/03 职场文书
违反课堂纪律检讨书
2014/01/19 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
少年闰土教学反思
2014/02/22 职场文书
幼儿园运动会口号
2014/06/07 职场文书
组工干部对照检查材料
2014/08/25 职场文书
公民授权委托书
2014/10/15 职场文书
前台文员岗位职责
2015/02/04 职场文书
奖学金个人总结
2015/03/04 职场文书
Oracle中update和select 关联操作
2022/01/18 Oracle
Win11应用商店打开闪退怎么解决? win11应用商店打不开的多种解决办法
2022/04/05 数码科技