摘要:HWND控制視窗動作
由於雷射機台參數檔案過於多,USER反應希望能
變成比較人性化一點的方式操作,討論後做一個小程式去刷參數檔案並COPY到廠商參數檔案的資料夾內
變成每次參數只會留一個,而原始程式必須按更新下拉combox才會去做更新LIST清單動作
如原設定參數檔不見(更新會跳出錯警告窗),所以就必須先透過外部程式把要參數檔案刷進去
刷完在下拉combox並載入後設定,知道大致上的操作就開始動手做半自動外掛小程式
幫助USER別再挑錯了
1.首先要有兩個好用的小幫手程式
Microsoft_Spy++_14.0.22129.1
WinSpy17
可以方便看視窗的相關資訊
核心code
procedure TGAS29999_M.bt_sendClick(Sender: TObject); var LOG_STR,Ins_str: string; num,i,j,flag,flag2:integer; sqlarrayer: OleVariant; sr: TSearchRec; sPath,f,starget: String; FileList,s1 : TStringList; arr: array[0..254] of Char; var WHandle,WHandle2,wnd,wnd2,wnd3,wnd4,wchild,wchild2,wchild3,wchild3t,wchild4:HWND; begin clientdataset2.Close; clientdataset2.CommandText := 'SELECT * FROM PARAM_POOL WHERE PARAM_CATEGORY=''LS_Machine'' AND PARAM_NAME=''LS_Machine01'''; clientdataset2.Open; if clientdataset2.FieldByName('PARAM_VALUE').AsString <> p_ver then begin messageDlg('程式版本需變更請先執行CIM,再執行此程式!!', mtError, [mbOk], 0); close; //20150923001 end else if t_recipes.Text <>'' then begin FileList:=TStringList.Create; sPath:=T_Source.text+t_recipes.Text+t_subfile.text; starget:=T_Target.text+t_recipes.Text+t_subfile.text; f := T_Target.text+'*.*'; if FindFirst(f, faAnyFile, sr) = 0 then begin repeat if ((sr.Attr and faArchive)>0)then begin DeleteFile(T_Target.text+sr.Name) end; until FindNext(sr) <> 0; end; if FindFirst(sPath, faAnyFile, sr) = 0 then begin repeat if ((sr.Attr and faArchive)>0)then begin FileList.Add(T_Source.text+sr.Name); if CopyFile(PChar(sPath), PChar(starget), False) then ShowMessage('檔案複製成功!') else ShowMessage('檔案複製失敗!'); end; until FindNext(sr) <> 0; end else begin messageDlg('資料夾內無此RECIPE', mtError, [mbOk], 0); end; FindClose(sr); end else messageDlg('請刷入RECIPE資料!!', mtError, [mbOk], 0); //第一個面板 start s1:=tstringlist.Create; flag :=0; j:=0 ; wnd := FindWindow('ThunderRT6FormDC',nil); while flag = 0 do begin wnd2:= FindWindowEx(wnd,0,'ThunderRT6Frame',nil); For i := 1 to 30 do begin if wnd2 <> 0 then begin wnd3:=FindWindowEx(wnd2,0,'Button','參數設定'); if wnd3 <> 0 then flag:=1; if wnd3 <> 0 then begin SendMessage(wnd3, BM_CLICK, 0,0); break; end; end; wnd2 := GetWindow(wnd2, GW_HWNDNEXT); end; inc(j); wnd := GetWindow(wnd, GW_HWNDNEXT); if j=200 then begin messageDlg('Error:line65', mtError, [mbOk], 0); break; end; end; //第一個面板 end //參數設定面板 強制更新 start flag :=0; j:=0 ; flag2 :=0; while flag2 = 0 do begin wchild := FindWindow('ThunderRT6FormDC',nil); num := GetWindowText(wchild, arr, SizeOf(arr)) ; // s1.Add(inttostr(j)+'-'+inttostr(i)+':'+arr+':'+IntToHex(wchild,2)) ; // s1.Add( copy(arr,1,12)) ; //3059c if copy(arr,1,12)='使用中參數檔' then begin flag2:=1 end; if flag2<>1 then wchild := GetWindow(wchild, GW_HWNDNEXT); inc(j); if j=100 then begin messageDlg('last_ErrorUP', mtError, [mbOk], 0); break;end; end; j:=0 ; while flag = 0 do begin wchild2:= FindWindowEx(wchild,0,'ThunderRT6Frame',nil); For i := 1 to 10 do begin if wchild2 <> 0 then begin wchild3:= FindWindowEx(wchild2,0,'ThunderRT6Frame',''); if wchild3 <> 0 then begin wchild4:=FindWindowEx(wchild3,0,'Button','更新'); if wchild4 <> 0 then begin PostMessage(wchild4, BM_CLICK, 0,0); flag:=1; break; end; end; end; wchild2 := GetWindow(wchild2, GW_HWNDNEXT); end; inc(j); if j=10 then begin messageDlg('Error:line113', mtError, [mbOk], 0); break; end; end; // messagebox click For i := 1 to 3 do begin sleep(600); WHandle:=FindWindow('#32770','NaviScriber'); WHandle2 := FindWindowEx(WHandle,0,'Button','確定'); if WHandle <> 0 then PostMessage(WHandle2, BM_CLICK, 0,0); end; //參數設定面板 強制更新 end //下拉combox Start flag2 :=0; while flag2 = 0 do begin wchild := FindWindow('ThunderRT6FormDC',''); wchild2:= FindWindowEx(wchild,0,'ThunderRT6Frame',''); For i := 1 to 3 do begin if wchild2<>0 then wchild3:=FindWindowEx(wchild2,0,'ThunderRT6Frame',nil); if wchild3 <> 0 then begin wchild4:=FindWindowEx(wchild3,0,'ThunderRT6ComboBox',nil); if wchild4 <> 0 then begin SendMessage(wchild4,WM_KEYDOWN,VK_DOWN,0); Sleep(300); PostMessage(wchild4,WM_KEYUP,VK_DOWN,0); flag2:=2; break; end; end; wchild2 := GetWindow(wchild2, GW_HWNDNEXT); end; wchild := GetWindow(wchild, GW_HWNDNEXT); inc(j); if j=100 then begin messageDlg('Error:line151', mtError, [mbOk], 0); break;end; end; // s1.SaveToFile('.\a.txt'); //下拉combox End //參數設定面板 正常重新更新 Start flag :=0; j:=0 ; flag2 :=0; while flag2 = 0 do begin wchild := FindWindow('ThunderRT6FormDC',nil); num := GetWindowText(wchild, arr, SizeOf(arr)) ; if copy(arr,1,12)='使用中參數檔' then begin flag2:=1 end; if flag2<>1 then wchild := GetWindow(wchild, GW_HWNDNEXT); inc(j); if j=100 then begin messageDlg('Error:line171', mtError, [mbOk], 0); break;end; end; j:=0 ; while flag = 0 do begin wchild2:= FindWindowEx(wchild,0,'ThunderRT6Frame',nil); For i := 1 to 10 do begin if wchild2 <> 0 then begin wchild3:= FindWindowEx(wchild2,0,'ThunderRT6Frame',''); if wchild3 <> 0 then begin wchild4:=FindWindowEx(wchild3,0,'Button','更新'); if wchild4 <> 0 then begin PostMessage(wchild4, BM_CLICK, 0,0); flag:=1; break; end; end; end; wchild2 := GetWindow(wchild2, GW_HWNDNEXT); end; inc(j); if j=10 then begin messageDlg('Error:line199', mtError, [mbOk], 0); break; end; end;
比較該注意的地方就是
WHandle:=FindWindow('#32770','XXX'); <Messagebox問題
PostMessage 常說的射後不理(送出去之後馬上就return)
SendMessage 反之送出後會停住等待處理完回應才會return
不過廠商的程式滿多沒寫視窗標題所以用nil去做全部比對
FindWindowEx(wchild,0,'ThunderRT6Frame',nil);
大家一起加入blogads 賺零用錢!!