該如何實作? |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
我手邊有一支別人寫的程式,固定每天要去作一些操作,會在其Edit上填一些
資料再按Button來執行,但重覆的動作我想寫一個小程式讓它可以自動化,所
以我必須先找出該Form上有哪些元件,再針對該元件來送訊息(SendMessage),
所以,我可能必須先找出如何得知該Form上有哪些元件,再對我所要的元件來
送訊息以達到我要的要求。我在深度歷險上有查到相關的資料,但對C我不懂
所以我也節錄給您參考,麻煩了,謝謝。
---------------------------------------------------
如何獲得另一支程式上的所有Components,
並且呼叫,例如那支程式上 有Button1的OnClick的事件.
謝謝! 先呼叫
EnumWindows((WNDENUMPROC)CB_EnumWindowsProc,0);
接著實做一個Call back function
在這個函式裡面檢查所有視窗的標題Caption, 是否是妳要尋找的 bool __stdcall CB_EnumWindowsProc( HWND hWnd, long)
{
char title[250];
char className[95]; if ( hWnd )
{
GetClassName(hWnd,className,95);
GetWindowText(hWnd,title,110);
if ( AnsiString(title) == "視窗標題" ) //比對視窗標題
EnumChildWindows( hWnd, (WNDENUMPROC)EnumChildWnd, 0);
//找到則呼叫EnumChildWindows開始檢查該視窗裡的所有視窗元件
}
return true;;
} 接著實做另一個 Call back function
在這個函式裡面檢查該視窗裡的所有視窗元件的標題 Caption, 是否是妳要尋找的 bool __stdcall EnumChildWnd( HWND hWnd, long )
{
char title[250];
char className[95]; if ( hWnd )
{
GetClassName(hWnd,className,95);
SendMessage( hWnd, WM_GETTEXT, 250, (LPARAM)title); if ( AnsiString( title ) == "確定" ) //比對按鈕上的文字
{
//找到了則呼叫 SendMessage 發出"BM_CLICK" 訊息給該按鈕, 完成了!
SendMessage(hWnd, BM_CLICK, 0, 0);
}
}
return true;
}
------
我也在努力學習中,若有錯謬請見諒。 |
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
站長幫您翻好了:
但實際運用您要自己執行看看了!
procedure TForm1.Button2Click(Sender: TObject); function EnumChildWindowsProc(hwnd: Integer): Boolean; stdcall; var buffer: array[0..255] of Char; str:string; begin Result := True; GetClassName(hwnd,buffer,256); Form1.Memo1.Lines.add(buffer); if uppercase(buffer)='TBITBTN' then begin SendMessage(hWnd, BM_CLICK, 0, 0); end; if uppercase(buffer)='TEDIT' then begin str:='abc'; SendMessage (hWnd, WM_SETTEXT, 0,longint(pchar(str))); end; end; var hwnd: Integer; buffer: Array[0..1023] of Char; begin Memo1.Clear; hwnd := FindWindow(nil,'form1'); if hwnd<>0 then EnumChildWindows(hwnd,@EnumChildWindowsProc,Integer(@hwnd)); end;~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
sanwin
一般會員 發表:20 回覆:60 積分:16 註冊:2002-06-03 發送簡訊給我 |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
|
tonyplus
初階會員 發表:22 回覆:97 積分:28 註冊:2002-04-13 發送簡訊給我 |
|
5997
一般會員 發表:1 回覆:7 積分:1 註冊:2003-01-14 發送簡訊給我 |
小地不才剛好看到這篇,目前小弟也遇到這個問題,站長回答的我測試過沒有問題
但是我的問題更複雜,一直測不出來,希望有心人士可以幫忙一下
如果有二個TEDIT 但是我希望第一個TEDIT可以寫入ABC第二個可以寫入DEF
還有三個RadioButton 我希望選擇第3個RadioButton
還有也有三個CheckBox我希望選擇第2個CheckBox
上面還有四個BitBtn 我希望選擇BitBtn2按下
我找了好多方法都找不出來,
希望有人可以幫我寫一下程式碼,
謝謝
------
帥哥 |
liorex
初階會員 發表:19 回覆:60 積分:32 註冊:2002-08-20 發送簡訊給我 |
我是將要被控制的程式加上一個com obj 來做控制他的方法
// send message procedure TForm1.Button1Click(Sender: TObject); var Ik : IrecFrmMeg ; begin IK := CreateComObject(CLASS_recFrmMeg) as IrecFrmMeg; iK.SetFrm(edit1.text,Edit2.text,strtoint(edit3.text),strtoint(edit4.text)); //----be Control TrecFrmMeg = class(TTypedComObject, IrecFrmMeg) protected function SetFrm(const edt1, edt2: WideString; rgid, chid: Shortint): HResult; stdcall; {Declare IrecFrmMeg methods here} end; implementation uses ComServ,unit1; function TrecFrmMeg.SetFrm(const edt1, edt2: WideString; rgid, chid: Shortint): HResult; begin with Form1 do begin Edit1.Text := edt1 ; Edit2.Text := edt2 ; RGPin.ItemIndex := rgid ; CheckBox1.Checked := chId = 1 ; CheckBox2.Checked := chid = 2 ; CheckBox3.Checked := chid = 3 ; end; end; end; |
5997
一般會員 發表:1 回覆:7 積分:1 註冊:2003-01-14 發送簡訊給我 |
謝謝你的回答非常感謝妳
我的問題已經解決了
我用最笨的方法,直接控制滑鼠點選就好了
Sleep(50);
SetCursorPos(875,757);
mouse_event(MOUSEEVENTF_RIGHTDOWN,875,757,0,0);
mouse_event(MOUSEEVENTF_RIGHTUP,875,757,0,0);
用這個方法可以解決而且又不用找出classname粉方便
但是我又遇到了一個問題
[如何在目前游標的位置輸入文字]
希望大家可以幫幫忙 帥哥
------
帥哥 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |