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

FindWindowEx一直失敗>"<

尚未結案
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-16 09:23:49 IP:59.120.xxx.xxx 未訂閱
剛接觸Window API,所以不知道哪邊寫錯....我想要取得我的程式上的一個Edit元件的Handle...程式如下: hwnd = FindWindow(NULL,"myprojectname"); if (hwnd) hwnd = FindwindowEx(hwnd, 0, "Edit",0); 第一個hwnd成功…可是到第二個就失敗了…我試過改成"TEdit"也不行…不知道哪邊錯了…>"<
enter2004
初階會員


發表:51
回覆:94
積分:34
註冊:2005-04-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-16 19:27:29 IP:140.113.xxx.xxx 未訂閱

===================引 用 文 章===================
剛接觸Window API,所以不知道哪邊寫錯....我想要取得我的程式上的一個Edit元件的Handle...程式如下: hwnd = FindWindow(NULL,"myprojectname"); if (hwnd) hwnd = FindwindowEx(hwnd, 0, "Edit",0); 第一個hwnd成功…可是到第二個就失敗了…我試過改成"TEdit"也不行…不知道哪邊錯了…>"<


應該是改成 Edit1 吧
------
人生就像泡泡一樣,乘著風被吹著跑,等你發現時已經消失了。
就在快要消失的瞬間,希望能再飛高一點,
但是回神時總是慢了一步。
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-17 14:07:12 IP:61.229.xxx.xxx 未訂閱
奇怪,這題目怎麼我昨天才回應,但沒看到 @@

我測式過了,那個地方是要放TEdit才是正確的! 我用window的api去查過它的class name,但是怪的是,若你要找的那個window是本身自己,比如說你本身的title bar 叫 Form1而你查的就是Form1,而Form1下有一個Edit1那一切都正常,都可以得到handle。若你查的是別人的window,那就只能查到父的,不能查到子的元件,真的很怪,也不明白!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-17 14:17:32 IP:61.229.xxx.xxx 未訂閱

從貼我昨天可能沒有post成功的內容:
請參考程式碼:

HANDLE chwnd = 0;
HANDLE phwnd = ::FindWindow(NULL,"Test");

char szText[256] = {0};

if (phwnd)
{
chwnd = ::FindWindowEx(phwnd,0,"TEdit",0);
::GetWindowText(chwnd,szText,255);
}

ShowMessage(String().sprintf("Parent= %d, Child= %d, Text=%s",phwnd,chwnd,szText));

若這個程式的title就叫Test,那一切正常! 若是別的程式的tile 叫 Test 那你只能查到父handle,不知是為何吶! 我也納悶!
但可以確定的是,不用去改什麼Eidt, Edit1之類的…因為照api的文件上也講是要放入註冊的class name,Edit1是instance object name…而我也驗証過,用GetClassName這個win32 api 查過,低層的註冊名就是TEdit。

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-08-17 18:55:36 IP:61.229.xxx.xxx 未訂閱

一定是我之前測到昏頭以為別的不行,事實上無論是自己或是別的window都可以查得到!!
現在把新的測式程式放上來,是更完整的:

HANDLE chwnd = 0, phwnd = 0;
int i =0;
String result("");
char szText[256] = {0};

struct
{
HANDLE h;
char name[50];
}child[20]={0}; //最多20個control,可改


phwnd = ::FindWindow(NULL,"Coder");

if (phwnd)
{
while((chwnd = FindWindowEx(phwnd,chwnd,"TEdit",0))) //除TEdit外,也可以是TButton,或是0表全部
{
child[i].h = chwnd;
if(GetWindowText(chwnd,szText,20)) //字串內容最大20個,只是為了了解元件是哪個
strcpy(child[i].name, szText);
result.cat_sprintf("Parent= %d, Child= %d, Text=%s \n",phwnd,child[i].h,child[i].name);
i ;
}
}

ShowMessage(result);

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-08-17 19:12:42 IP:61.229.xxx.xxx 未訂閱
再補充一下,在FindWindowEx 中的registry class name 參數不一定猜得到,若會用純c寫windows的人應該都知道它是代表WNDCLASS這個結構體中的ClassName部份。經過VCL包裝後,你實在很難猜得到作者當時會註什麼名字,那個class name不是指 c 的class的東西,所以用c 的class名來猜也不一定對! for example : 經我測過注名的TntEdit元件,它的"註冊名"是TTntEdit.UnicodeClass,很難猜吧…

所以有必要的時候要用:

char cn[256]= {0};
if(::GetClassName(TntEdit1->Handle,cn,255))
ShowMessage(cn);

這樣的api來查一下!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-04-26 0:15:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!