在寫一個軟體, 模擬點擊另一個軟體的界面, 假設點擊(使用mouse_event 或 SendMessage )后 , 應該彈出一個對話框 , 如何才能確定這個對話框已經彈出?
目前用的方法是 立即查找期望的視窗句柄(FindWindow FindWindowEx ), 如果找不到 等待一秒后再查找, 還是找不到則認為出錯 , 老大認為這個方法不穩定 , 如果放在配置很低的機器上會出錯. 請問有什么好的辦法嗎?
uj5u.com熱心網友回復:
百度搜“后臺呼叫外部程式的完美實作(使用CreateDesktop建立隱藏桌面)”uj5u.com熱心網友回復:
http://www.autohotkey.comuj5u.com熱心網友回復:
查到了對應的鏈接 http://www.cnblogs.com/findumars/p/5236726.html 鏈接中的代碼假設30秒內還是找不到對應視窗則報錯. 這對于必然出現的視窗是可行的.
但我需要對一個可能出現的進度條進行處理 , 如果該進度條出現, 則等待進度條完成, 如果該進度條不出現, 則不做處理繼續下一步, 問題在于, 如果等待30秒才判斷進度條不會出現, 那么程式效率過低 , 如果等待一兩秒, 那么可能進度條本身會出現, 但是等待時間過短, 結果認為進度條不會出現, 跳過了處理步驟. 需要一個不依賴與等待時間的方法解決這個問題.
uj5u.com熱心網友回復:
DLL注入??uj5u.com熱心網友回復:
SendMessage 是直接呼叫WindowProc的, 因此SendMessage 的回傳也是表明訊息已經被處理過了SendInput(keybd_event 和 mouse_event )模擬的訊息 正常是PostMess投遞到訊息佇列中, 因此可以考慮Hook WH_GETMESSAGE
uj5u.com熱心網友回復:
使用 SendMessage ,uj5u.com熱心網友回復:
行程回應的時候發個訊息告訴就好了。或者用全域變數,回應的時候就改變全域變數,在另一個行程里面判斷那個變數。uj5u.com熱心網友回復:
不能判斷uj5u.com熱心網友回復:
正解!
uj5u.com熱心網友回復:
使用鉤子檢查訊息應該可行, 先試試看
uj5u.com熱心網友回復:

我用過影像識別,比較彈出的區域圖片比較
uj5u.com熱心網友回復:
這個可能太復雜了 , 實在不行再考慮這個辦法
uj5u.com熱心網友回復:
另一個程式是別人寫好的 , 要是兩個程式都是自己寫直接行程間通訊就行了啊
uj5u.com熱心網友回復:
“一個可能出現的進度條”這個進度條 干什么 ? 能不能 從它 的 目的 出發? 如是寫 檔案 ,檢測 檔案 變化。
uj5u.com熱心網友回復:
可以試試用ValueProperty這個事件(https://docs.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-support-for-the-progressbar-control-type)用法大概是這樣
Automation.AddAutomationPropertyChangedEventHandler(element,
TreeScope.Element,
propChangeHandler = new AutomationPropertyChangedEventHandler(OnPropertyChange),
ValuePattern.ValueProperty);
但是需要目標程式支持UI自動化(例如是用的Win32控制元件/WPF,或者MFC/Winforms這樣的封裝類)
uj5u.com熱心網友回復:
樓上的是大神啊uj5u.com熱心網友回復:
用這個現成的插件吧。
大漠插件,
系結視窗->找圖,找文字,你就可以實作你要的功能 了。
這個插件的用法很簡單的,用法自己百度吧。
先找你要的按鈕,再找確定對話框。
僅供參考
ret = dm.FindPic(0,0,iWidth,iHeight,"按鈕.bmp","000000",0.9,2,&x,&y);
ret = dm.FindPic(0,0,iWidth,iHeight,"確定.bmp","000000",0.9,2,&x,&y);
if (x.lVal >0 && y.lVal)
{
dm.MoveTo(x.lVal+3,y.lVal+3);
MySleep(200);
dm.LeftClick();
break;
}
uj5u.com熱心網友回復:
"立即查找期望的視窗句柄(FindWindow FindWindowEx ), 如果找不到 等待一秒后再查找, 還是找不到則認為出錯 , 老大認為這個方法不穩定 , 如果放在配置很低的機器上會出錯."不懂為什么這個方法為什么不穩定,為什么出錯。FindWindow 這函式不是哪里都可以用的嗎?
uj5u.com熱心網友回復:
使用FindWindow 輪詢,才是最簡單最靠譜的寫個for回圈,每隔1秒查詢一次,重試30次(或更多次)還找不到,就做錯誤處理
uj5u.com熱心網友回復:
總結各位的方法,1. FindWindow 老實等待, 比如等待最長30秒, 這個辦法效率極低, 如果對偶爾才出現的視窗等待(比如更新提示視窗) , 則很可能會等夠30秒, 如果把30秒調低, 比如調到3秒 ,那么對于一定出現的視窗 , 可能因為cpu繁忙, 3秒內視窗無法繪制完成, 導致無法找到需要的視窗.
2. ValueProperty 沒有考慮這個辦法, 因為想要控制的軟體是由delphi寫的
3. 影像識別 , 這個辦法可能可行, 但我沒有嘗試.
4. hook 最后采用了這個方法 , hook后可以進行行程間通信, 相當于自己撰寫兩個程式.
uj5u.com熱心網友回復:
WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/65447.html
標籤:界面
上一篇:隔了快十年回來看看, 竟然發現兩個老面孔,還呆在版主的位置上
下一篇:mscomm控制元件接收資料問題
