上一篇講到用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的句柄