原创-使用pywinauto和swapy-ob-0.4.3进行dotnet的winform程序控制(二)

上一篇讲到用winspy++这个工具分析dotnet的winform的程序,再使用pywinauto控制。这篇我加入了自动分析工具swapy-ob-0.4.3,辅助进行分析。

首先启动winform程序

然后再启动swapy

出现??的原因是swapy这个程序对中文unicode不支持显示

右击Form1,选择Click

生成了Form1的代码

拷贝右侧的代码,试着运行

import pywinauto

pwa_app = pywinauto.application.Application()
w_handle = pywinauto.findwindows.find_windows(title=u'Form1', class_name='WindowsForms10.Window.8.app.0.141b42a_r16_ad1')[0]
window = pwa_app.window_(handle=w_handle)
window.Click()

输出如下提示:

E:pyautogui>python swaptest.py
swaptest.py:5: DeprecationWarning: Method .window_() is deprecated, use .window(
) instead.
  window = pwa_app.window_(handle=w_handle)
Traceback (most recent call last):
  File "swaptest.py", line 5, in <module>
    window = pwa_app.window_(handle=w_handle)
  File "C:Python37-32libsite-packagespywinauto\__init__.py", line 50, in wra
p
    return method(*args, **kwargs)
  File "C:Python37-32libsite-packagespywinautoapplication.py", line 1203, i
n window
    raise AppNotConnected("Please use start or connect before trying "
pywinauto.application.AppNotConnected: Please use start or connect before trying
 anything else

提示是说未启动程序导致,顺便也点击Form1下的控件

点击Edit3的右键click生成代码

 ctrl = window['3']

ctrl.Click()

这个目的是为了获取控件的访问id,进行了改造代码如下:

import pywinauto

pwa_app = pywinauto.application.Application().start("WindowsFormsInput.exe")
w_handle = pywinauto.findwindows.find_windows(title=u'Form1', class_name='WindowsForms10.Window.8.app.0.141b42a_r16_ad1')[0]
window = pwa_app.window_(handle=w_handle)
ctrl = window['3']
ctrl.type_keys(r"E:pyautoguice.png")

运行代码后的效果是,打开了程序,但控制台报错:

在不关闭winfom下,再次运行这个脚本,这次成功了。

也就是证明这种方式的调用dotnet的winform,dotnet在首次展示窗口前,存在一定的延时。所以导致

w_handle = pywinauto.findwindows.find_windows(title=u'Form1', class_name='WindowsForms10.Window.8.app.0.141b42a_r16_ad1')[0]

获取不到程序句柄数组。于是我加入了延时语句,改造如下:

import pywinauto,time

pwa_app = pywinauto.application.Application().start("WindowsFormsInput.exe")
time.sleep( 0.1 )
w_handle = pywinauto.findwindows.find_windows(title=u'Form1', class_name='WindowsForms10.Window.8.app.0.141b42a_r16_ad1')[0]
window = pwa_app.window(handle=w_handle)
ctrl = window['3']
ctrl.type_keys(r"E:pyautoguice.png")
window[u'设置'].click()

效果如下:

总结:采用swapy生成的运行代码的机制,运行dotnet的winform时,要加入一定的延时,让加载winform的ui后,才能获取到winform的句柄

原文地址:https://www.cnblogs.com/qkabcd/p/11106075.html