利用FindWindow將其他form物件下所有的資料取出來 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
目的1:
解決 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30329 之問題 目的2:
本程式利用 FindWindow 及 EnumChildWindows 將其他 form 物件下的所有子物件之classname 及 有文字的內容取出. 通常我們想要在目前的視窗 form 下找其上的一些資訊, 這支小程式很好用. 用來解讀其他程式跑出的 alert message, prompt message 等都能夠取得到.
使用API 有 FindWindow , EnumChildWindows , 及 SendMessage 配合 WM_GETTEXT 參數以取得文字內容, 接下來的利用就可以寫一些檢查程式是否作業正常或是可以再加上一些程式來進行操作該程式的動作.. 舉一個例子, 在 src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=9517404&CC=212856"> 利用本程式將可以取得該 messagedlg 的三個 button 及訊息資料如下:
|
njjsl
一般會員 發表:1 回覆:2 積分:0 註冊:2003-10-23 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
washare
初階會員 發表:14 回覆:36 積分:35 註冊:2006-10-17 發送簡訊給我 |
|
hotswin
中階會員 發表:72 回覆:92 積分:52 註冊:2003-11-06 發送簡訊給我 |
|
bruce
中階會員 發表:19 回覆:121 積分:83 註冊:2002-04-16 發送簡訊給我 |
|
anyone
中階會員 發表:1 回覆:63 積分:52 註冊:2007-02-12 發送簡訊給我 |
|
rachex2000
一般會員 發表:21 回覆:32 積分:20 註冊:2003-04-28 發送簡訊給我 |
這樣表示我若寫一支視窗程式,即使將按鈕disable,別的程式還是有辦法強迫按下按鈕執行裡面的程式摟?這樣不是很不安全嗎?
===================引 用 anyone 文 章=================== 好像過了好久了,不過沒人回答 剛好路過看到就回一下 你可以用EnableWindow(Button.Handle, true) 就可以讓它變成enable 反之設false,則就是disable ===================引 用 washare 文 章=================== 請問如果一個button被disable了,要送那個一訊息才能讓它變成enable呢?謝謝 |
T-Jason
一般會員 發表:5 回覆:20 積分:10 註冊:2003-05-19 發送簡訊給我 |
曾試過讓Disable的button 改為 enable,但沒做用,不解的是我用 delphi 寫的程式 enable 後有做用 ???
===================引 用 rachex2000 文 章=================== 這樣表示我若寫一支視窗程式,即使將按鈕disable,別的程式還是有辦法強迫按下按鈕執行裡面的程式摟?這樣不是很不安全嗎? ===================引 用 anyone 文 章=================== 好像過了好久了,不過沒人回答 剛好路過看到就回一下 你可以用EnableWindow(Button.Handle, true) 就可以讓它變成enable 反之設false,則就是disable ===================引 用 washare 文 章=================== 請問如果一個button被disable了,要送那個一訊息才能讓它變成enable呢?謝謝 |
anyone
中階會員 發表:1 回覆:63 積分:52 註冊:2007-02-12 發送簡訊給我 |
是的,只要偵測的到按鈕,取得其Handle值
就可以按下去,我有試過就算按鈕disable 不用透過enable就可將按鈕給按下。 如您所說的確是不安全,安全的方式還是有人做出來 就是讓按鈕沒有Handle值,或是用Static的方式 使得送按下的訊息也沒有用 至於如何做,小弟我也很想知道 ===================引 用 rachex2000 文 章=================== 這樣表示我若寫一支視窗程式,即使將按鈕disable,別的程式還是有辦法強迫按下按鈕執行裡面的程式摟?這樣不是很不安全嗎? ===================引 用 anyone 文 章=================== 好像過了好久了,不過沒人回答 剛好路過看到就回一下 你可以用EnableWindow(Button.Handle, true) 就可以讓它變成enable 反之設false,則就是disable ===================引 用 washare 文 章=================== 請問如果一個button被disable了,要送那個一訊息才能讓它變成enable呢?謝謝 ? |
anyone
中階會員 發表:1 回覆:63 積分:52 註冊:2007-02-12 發送簡訊給我 |
一定可以啦!不過若要按下的話,直接送按下的訊息就好
不用enable按鈕了,試試吧! ===================引 用 T-Jason 文 章=================== 曾試過讓Disable的button 改為 enable,但沒做用,不解的是我用 delphi 寫的程式 enable 後有做用 ??? ===================引 用 rachex2000 文 章=================== 這樣表示我若寫一支視窗程式,即使將按鈕disable,別的程式還是有辦法強迫按下按鈕執行裡面的程式摟?這樣不是很不安全嗎? ===================引 用 anyone 文 章=================== 好像過了好久了,不過沒人回答 剛好路過看到就回一下 你可以用EnableWindow(Button.Handle, true) 就可以讓它變成enable 反之設false,則就是disable ===================引 用 washare 文 章=================== 請問如果一個button被disable了,要送那個一訊息才能讓它變成enable呢?謝謝 |
rachex2000
一般會員 發表:21 回覆:32 積分:20 註冊:2003-04-28 發送簡訊給我 |
我試過,發現以下程式可以將另一程式(一Form與一被disable的按鈕)的按鈕enable並按下, 但只有看到按鈕按下的動作,部會執行Click事件內的程式碼,不過按鈕enable後, 手動按下,就可以執行Click事件內的程式碼,所以確實有安全性的問題, 不寫 EnableWindow(h, true); 那行,則按鈕還是不能按下,和前文說得不同, 有辦法執行到OnClick事件內的程式碼嗎?
<textarea cols="60" rows="10" class="delphi" name="code"> function EnumChildProc(h: hwnd; a: integer): boolean; stdcall; var str: array[0..1024] of Char; begin result := true; if h <> 0 then begin GetClassName(h, str, 1024); Form1.Memo1.Lines.Add('classname=' str); SendMessage(h, WM_GETTEXT, 1024, integer(@str[0])); Form1.Memo1.Lines.Add('gettext=' str); Form1.Memo1.Lines.Add(''); EnableWindow(h, true); SendMessage(h, WM_LBUTTONDOWN, 0, 0); end; end; procedure TForm1.Button2Click(Sender: TObject); var h: HWND; hButton: HWND; begin h := FindWindow(nil, PChar(Edit1.Text)); if h <> 0 then begin EnumChildWindows(h, @EnumChildProc, 0); end; end; </textarea>
編輯記錄
rachex2000 重新編輯於 2007-08-03 09:56:20, 註解 無‧
rachex2000 重新編輯於 2007-08-03 09:57:39, 註解 無‧ rachex2000 重新編輯於 2007-08-03 09:58:30, 註解 無‧ rachex2000 重新編輯於 2007-08-03 09:59:30, 註解 無‧ |
anyone
中階會員 發表:1 回覆:63 積分:52 註冊:2007-02-12 發送簡訊給我 |
你把SendMessage(h, WM_LBUTTONDOWN, 0, 0);這一行改成
SendMessage(h, BM_CLICK,0,0);就會執行Click事件了 不寫EnableWindow(h, true)就可以按下,之前我試可以(不過不是我寫的視窗Button) 我自己寫一個去試的確不行,那就麻煩一點多加一句Enablewindow就好了 ===================引 用 rachex2000 文 章=================== 我試過,發現以下程式可以將另一程式(一Form與一被disable的按鈕)的按鈕enable並按下, 但只有看到按鈕按下的動作,部會執行Click事件內的程式碼,不過按鈕enable後, 手動按下,就可以執行Click事件內的程式碼,所以確實有安全性的問題, 不寫 EnableWindow(h, true); 那行,則按鈕還是不能按下,和前文說得不同, 有辦法執行到OnClick事件內的程式碼嗎? <textarea class="delphi" rows="10" cols="60" name="code"> function EnumChildProc(h: hwnd; a: integer): boolean; stdcall; var str: array[0..1024] of Char; begin result := true; if h <> 0 then begin ????GetClassName(h, str, 1024); ????Form1.Memo1.Lines.Add('classname=' str); ????SendMessage(h, WM_GETTEXT, 1024, integer(@str[0])); ????Form1.Memo1.Lines.Add('gettext=' str); ????Form1.Memo1.Lines.Add(''); ????EnableWindow(h, true); ????SendMessage(h, WM_LBUTTONDOWN, 0, 0); end; end; procedure TForm1.Button2Click(Sender: TObject); var h: HWND; hButton: HWND; begin h := FindWindow(nil, PChar(Edit1.Text)); if h <> 0 then begin ????EnumChildWindows(h, @EnumChildProc, 0); end; end; </textarea> |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |