续接前文:
https://blog.csdn.net/tan_kaishuai/article/details/97893739
本文主要演示如何使用 Python 操作一个实际的ActiveX控件。
目标控件为“五虎大战”棋类小游戏,可在这里获取下载:
https://github.com/tankaishuai/My_ActiveX_DLL_MIX_DEV/blob/master/ActiveX/Tigers5.ocx
示例如下:
首先导入:win32exts 并初始化 API 列表及 COM 环境:
>>> import win32exts
>>> win32exts.load_sym("*", "*")
>>> win32exts.CoInitialize(0)
指定控件的显示位置,以及显示参数(SW_SHOW):
>>> win32exts.co_push_start()
>>> win32exts.push_bstr("0,0,600,500") ‘可选项
>>> win32exts.push_value(1) ‘可选项
开始创建控件对象:
>>> ax = win32exts.create_ax_object("工程2.Tigers5", -1) ’如果想将控件创建在指定位置,第2个参数传入父窗口句柄
然后控件即显示出来了:
调用控件方法: ax.Ax_ListSym() 显示控件有哪些方法或者属性:
>>> print win32exts.co_invoke(ax, "Ax_ListSym", True)
----Function----
QueryInterface=1610612736(1)
AddRef=1610612737(1)
Release=1610612738(1)
GetTypeInfoCount=1610678272(1)
GetTypeInfo=1610678273(1)
GetIDsOfNames=1610678274(1)
Invoke=1610678275(1)
CaptionLBL=1745027076(get)(0)
CaptionLBL=1745027076(put)(0)
CaptionBTN=1745027075(get)(0)
CaptionBTN=1745027075(put)(0)
ImgTiger=1745027074(get)(0)
ImgTiger=1745027074(put_ref)(0)
ImgDragon=1745027073(get)(0)
ImgDragon=1745027073(put_ref)(0)
ImgShow=1745027072(get)(0)
ImgShow=1745027072(put_ref)(0)
可见空间有一个标签文本属性:CaptionLBL,支持读写操作。下面获取其内容:ax.get_CaptionLBL()
>>> print win32exts.co_get(ax, "CaptionLBL", True)
加油啊!!!
下面我们修改这个属性,亦即:ax.put_CaptionLBL( newVal )
>>> win32exts.co_push_start()
>>> win32exts.push_bstr("~~~ new caption ~~~")
>>> win32exts.co_put(ax, "CaptionLBL")
界面变化为:
可见已经正确修改。
下面调用控件的方法 Ax_ShowWindow() 隐藏控件:
【Ax_*** 开头几个固有的方法为 win32exts提供, 所有控件均有!】
>>> win32exts.co_push_start()
>>> win32exts.push_value(0) ' SW_HIDE
>>> win32exts.co_invoke(ax, "Ax_ShowWindow", True)
如果我们想要销毁控件:
>>> win32exts.co_release(ax)
1
返回值为 1,可见控件仍未销毁。事实上,该控件依旧被 win32exts 环境引用了一次。
如果再次调用:
>>> win32exts.co_release(ax)
0
ActiveX控件即被销毁。但是不建议这样重复释放操作,正确的做法如下:
>>> win32exts.delete_ax_object("工程2.Tigers5")
0
告诉 win32exts 环境不再引用该控件对象。