線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1526
推到 Plurk!
推到 Facebook!

取外部程序的元件

尚未結案
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-17 15:18:03 IP:211.156.xxx.xxx 未訂閱
请问有没有办法可以读取一个EXE程序中所有元件的类型和名称?如果通过DLL接口而且知道了主窗口的handle,可以取得其上所有元件的handle吗?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-17 15:27:15 IP:218.16.xxx.xxx 未訂閱
請參看 timhuang 兄 和 dllee 兄的近期作品 : 利用FindWindow將其他form物件下所有的資料取出來 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30409 列出所有視窗及視窗內所有子視窗資料 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30489
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-17 15:41:29 IP:211.156.xxx.xxx 未訂閱
谢谢。但这只能取出各元件的类名。有没有方法可以同时取得handle?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-17 15:48:25 IP:218.16.xxx.xxx 未訂閱
例中的 h 就是 handle 啦,若沒 handle 甚取得其他資料?
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-17 16:17:51 IP:211.156.xxx.xxx 未訂閱
不好意思。没看清楚。但不知为什么,如果将第一个程序置於DLL中,好像不起效。某个EXE中有10个元件,在它的DLL中加入上述程序后也如数地调用了十次EnumChildProc, 但所读出的类名全是空的。如果将它写成独立的程序则完全没问题。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-17 16:26:32 IP:218.16.xxx.xxx 未訂閱
那最好請 timhuang 兄親自來解答一下,剛才還看見他在線,希望他看到。
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-17 16:49:11 IP:211.156.xxx.xxx 未訂閱
谢谢。总算得到想要的handle了。但DLL问题仍未解决。 我还想问问,如果取得了其中一个combobox元件的handle。怎样可以改变combobox中的每一项的文字?可以截获点选combobox中的的项时向程序发出的message吗(我是想不该程序响应combobox动作)?怎样可以获得这个元件的位置及大小?如何把它隐藏起来? 对不起。问题多多。再次感谢
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-18 00:15:02 IP:61.221.xxx.xxx 未訂閱
改變 ComboBox 中的選項, 可以利用 CB_DELETESTRING 再 CB_INSERTSTRING 即可. 但沒有直接修改的功能. 假設修改的 combobox handle 為 h, 要修改的是第 1個 item (和 delphi 算法一樣由第 0個起), 範例如下:    
var
  str: Array[0..1024] of Char;
begin
  strPCopy(str, 'modified item');
  SendMessage(h, CB_DELETESTRING, 1, 0);
  SendMessage(h, CB_INSERTSTRING, 1, integer(@str[0]));
end;
至於 ComboBox 事件的部分弟還沒有那麼深入的研究, 不好意思. 取得內容的部分可以使用 CB_GETLBTEXT 來取得. 若要取得其位罝及大小是可以使用 GetWindowRect 或 GetClientRect 即可取得, 至於要顯示或是消失, 可以使用
顯示  SetWindowPos(getCurHandle, 0, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_SHOWWINDOW);
消失  SetWindowPos(getCurHandle, 0, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_HIDEWINDOW);
上面的項目除設定 ComboBox 內容外, 其餘功能已寫成一小範例在: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30620 另外上面所提及的一些 windows 訊息在 delphi 的 on-line help 中都有說明, 可以自行參閱. 發表人 - timhuang 於 2003/05/18 00:17:24
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-18 00:22:29 IP:211.156.xxx.xxx 未訂閱
太太太利害了。我就是无从入手。总觉得跟winapi打交道很难。非常感谢。 另外,为什么取出所有元件的范例移到DLL后不起作用?我的意思是,在DLL直接给出某个宿主窗口的handle(不用findwindow),然后用范例中的方法读出所有元件。但读出的元件数目是对了,但所有的classname都是空的。 發表人 - KFC 於 2003/05/18 00:26:39
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-18 23:58:37 IP:211.156.xxx.xxx 未訂閱
好像是这个findwindow有问题。如果将代码写在DLL中,当寻找某个主窗体的子窗体时,就是找不著。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-19 10:19:22 IP:211.76.xxx.xxx 未訂閱
應該是不會這樣才對. 確定是正確的 handle 嗎? 都是利用 api 中的呼叫, 應該是不會有問題的.
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-19 18:27:49 IP:211.156.xxx.xxx 未訂閱
一放到DLL中就是不对?
系統時間:2024-03-29 21:23:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!