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基础教程之循环介绍
Aug 29 Python
Python中if __name__ == '__main__'作用解析
Jun 29 Python
Python加密方法小结【md5,base64,sha1】
Jul 13 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
详解python中executemany和序列的使用方法
Aug 12 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
在Python中如何使用yield
Jun 07 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 5.3新特性命名空间规则解析及高级功能
2010/03/11 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
详解使用nvm安装node.js
2017/07/18 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
详解Node 定时器
2018/02/26 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
js实现左右轮播图
2020/01/09 Javascript
js实现简单的打印表格
2020/01/15 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
ptyhon实现sitemap生成示例
2014/03/30 Python
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
用pycharm开发django项目示例代码
2019/06/13 Python
python打造爬虫代理池过程解析
2019/08/15 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
电气工程和自动化自荐信范文
2013/12/25 职场文书
经典大学生求职信范文
2014/01/06 职场文书
创先争优活动承诺书
2014/08/30 职场文书
谢师宴学生致辞
2015/07/27 职场文书