原創-使用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:\py\autogui>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-32\lib\site-packages\pywinauto\__init__.py", line 50, in wra
p
    return method(*args, **kwargs)
  File "C:\Python37-32\lib\site-packages\pywinauto\application.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:\py\autogui\ce.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:\py\autogui\ce.png")
window[u'設置'].click()

效果如下:

總結:采用swapy生成的運行代碼的機制,運行dotnet的winform時,要加入一定的延時,讓加載winform的ui后,才能獲取到winform的句柄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM