如何得到某個AP目前Focus的child window其中某個元件的Handle?? |
尚未結案
|
wivern
初階會員 發表:31 回覆:63 積分:28 註冊:2002-07-31 發送簡訊給我 |
請問一下,我想要抓到一個MDI應用程式目前focus的子視窗其中一個元件的handle,
這該怎麼做呢??
我已經用FindWindow找到主視窗的Handle,
之後該怎麼做呢??
看了站上一些文章,
有說到可以用RealChildWindowFromPoint來取得目前滑鼠座標的視窗的Handle,
還有別的辦法可以做嗎??
我用SPY 看到我要抓的元件的Class是"SysListView32",
可以由這點去抓到我的的資料嗎??
是不是要用EnumChildWindows這個API呢??
我看了好多文章還是不太了解要怎麼用,能否教教我呢?
還有一個問題,那個child window上有兩個ListView,
我要怎麼知道哪一個才是我要的呢?? 一次問了一堆問題,真是不好意思,還請各位大大指點個方向~~
小弟感激不盡!!
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
Cooky Kid
初階會員 發表:5 回覆:68 積分:44 註冊:2002-07-11 發送簡訊給我 |
引言: 請問一下,我想要抓到一個MDI應用程式目前focus的子視窗其中一個元件的handle,這該怎麼做呢?? 我已經用FindWindow找到主視窗的Handle, 之後該怎麼做呢?? 看了站上一些文章, 有說到可以用RealChildWindowFromPoint來取得目前滑鼠座標的視窗的Handle, 還有別的辦法可以做嗎?? 我用SPY 看到我要抓的元件的Class是"SysListView32", 可以由這點去抓到我的的資料嗎?? 是不是要用EnumChildWindows這個API呢?? ................先解決您第一個疑問:如何抓到一個MDI應用程式目前focus的子視窗其中一個元件的handle? 請參考下列程式碼: copy by "C Builder & Windows API範例辭典" 『以下程式碼歸文魁資訊股份公司所有』 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //- 2個取得子視窗的標準callback函式------------------------------------------ bool CALLBACK EnumProc(HWND, LPARAM); bool CALLBACK EnumChildProc(HWND, LPARAM); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //漏斗狀游標 Screen->Cursor = crHourGlass; //在增加資料完畢前,先鎖住更新畫面 ::LockWindowUpdate(Memo1->Handle); //清除Memo1所有文字 Memo1->Clear(); //逐一搜尋經過所有視窗handle ::EnumWindows( reinterpret_cast <WNDENUMPROC> (EnumProc), reinterpret_cast <LPARAM> (Memo1) ); //重新啟動被鎖住的視窗更新 ::LockWindowUpdate(0); //游標恢復預設值 Screen->Cursor = crDefault; } //--------------------------------------------------------------------------- //設定掃描現在視窗資訊,並呼叫掃描次一層子視窗 bool CALLBACK EnumProc(HWND HWin, LPARAM MemoAddress) { //嘗試將LPARAM轉換成Memo物件型態 TMemo* Memo = reinterpret_cast <TMemo*> (MemoAddress); //取得視窗資訊後,跳到下一行顯示 String Line = "\r\n"; //取得現視窗handle的類別名稱 char Buffer[128]; if(::GetClassName(HWin, Buffer, sizeof(Buffer))) Line = Buffer; //取得現視窗的標題文字or內含文字 if(::GetWindowText(HWin, Buffer, sizeof(Buffer))) Line = (" (" String(Buffer) ")"); //由Memo1顯示出來 Memo->Lines->Add(Line); //再搜尋此視窗下的子視窗及物件handle ::EnumChildWindows( HWin, reinterpret_cast <WNDENUMPROC> (EnumChildProc), MemoAddress ); //傳回真值,告知執行下次handle掃描 return true; } //--------------------------------------------------------------------------- //設定此掃描子視窗呼叫自己,將所有次一層子視窗都掃描過為止 bool CALLBACK EnumChildProc(HWND HWin, LPARAM MemoAddress) { //固定地址的變數,控制此子視窗階層位置 static int Nesting = 0; Nesting; //取得現在此子視窗的類別名稱 char NameBuffer[128]; if(::GetClassName(HWin, NameBuffer, sizeof(NameBuffer))) { TMemo* Memo = reinterpret_cast <TMemo*> (MemoAddress); String NextLine; for(int i = 0; i < Nesting; i) NextLine = "-\t"; NextLine = NameBuffer; Memo->Lines->Add(NextLine); } //呼叫自己,執行再次一層的子視窗掃描, //直到沒有次一層子視窗為止 ::EnumChildWindows( HWin, reinterpret_cast <WNDENUMPROC> (EnumChildProc), MemoAddress ); //回至現子視窗 --Nesting; //傳回真值,告知執行下次handle掃描 return true; } //--------------------------------------------------------------------------- |
Cooky Kid
初階會員 發表:5 回覆:68 積分:44 註冊:2002-07-11 發送簡訊給我 |
引言: 請問一下,我想要抓到一個MDI應用程式目前focus的子視窗其中一個元件的handle,這該怎麼做呢?? 我已經用FindWindow找到主視窗的Handle,之後該怎麼做呢?? 看了站上一些文章, 有說到可以用RealChildWindowFromPoint來取得目前滑鼠座標的視窗的Handle,還有別的辦法可以做嗎?? 我用SPY 看到我要抓的元件的Class是"SysListView32", 可以由這點去抓到我的的資料嗎?? 是不是要用EnumChildWindows這個API呢?? ................再提供您第二個疑問的線索: 有說到可以用RealChildWindowFromPoint來取得目前滑鼠座標的視窗的Handle,還有別的辦法可以做嗎?? 取得目前滑鼠座標的視窗的Handle與裡面的視窗資料,這就關係到『Mouse Hook』攔截全區域滑鼠訊息的技術了, 『Windows 95 程式設計指南』/碁峰/李書良-翻譯 這本書的第六章 訊息攔截(Hooks) 就是你需要的hook知識。 『C Builder 與Windows API 範例辭典』/文魁/鄭明.鄭世偉 這本書的附錄--攔截滑鼠hook訊息、攔截鍵盤hook訊息的二個範例 就是你需要的BCB實作Mouse hook範例成果。 |
wivern
初階會員 發表:31 回覆:63 積分:28 註冊:2002-07-31 發送簡訊給我 |
引言: 先解決您第一個疑問:如何抓到一個MDI應用程式目前focus的子視窗其中一個元件的handle? 請參考下列程式碼: copy by "C Builder & Windows API範例辭典" 『以下程式碼歸文魁資訊股份公司所有』謝謝你的回應,我剛剛去買了這本書,準備好好的k一下~~ 希望能有所收獲~~//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //- 2個取得子視窗的標準callback函式------------------------------------------ bool CALLBACK EnumProc(HWND, LPARAM); bool CALLBACK EnumChildProc(HWND, LPARAM); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //漏斗狀游標 Screen->Cursor = crHourGlass; //在增加資料完畢前,先鎖住更新畫面 ::LockWindowUpdate(Memo1->Handle); //清除Memo1所有文字 Memo1->Clear(); //逐一搜尋經過所有視窗handle ::EnumWindows( reinterpret_cast <WNDENUMPROC> (EnumProc), reinterpret_cast <LPARAM> (Memo1) ); //重新啟動被鎖住的視窗更新 ::LockWindowUpdate(0); //游標恢復預設值 Screen->Cursor = crDefault; } //--------------------------------------------------------------------------- //設定掃描現在視窗資訊,並呼叫掃描次一層子視窗 bool CALLBACK EnumProc(HWND HWin, LPARAM MemoAddress) { //嘗試將LPARAM轉換成Memo物件型態 TMemo* Memo = reinterpret_cast <TMemo*> (MemoAddress); //取得視窗資訊後,跳到下一行顯示 String Line = "\r\n"; //取得現視窗handle的類別名稱 char Buffer[128]; if(::GetClassName(HWin, Buffer, sizeof(Buffer))) Line = Buffer; //取得現視窗的標題文字or內含文字 if(::GetWindowText(HWin, Buffer, sizeof(Buffer))) Line = (" (" String(Buffer) ")"); //由Memo1顯示出來 Memo->Lines->Add(Line); //再搜尋此視窗下的子視窗及物件handle ::EnumChildWindows( HWin, reinterpret_cast <WNDENUMPROC> (EnumChildProc), MemoAddress ); //傳回真值,告知執行下次handle掃描 return true; } //--------------------------------------------------------------------------- //設定此掃描子視窗呼叫自己,將所有次一層子視窗都掃描過為止 bool CALLBACK EnumChildProc(HWND HWin, LPARAM MemoAddress) { //固定地址的變數,控制此子視窗階層位置 static int Nesting = 0; Nesting; //取得現在此子視窗的類別名稱 char NameBuffer[128]; if(::GetClassName(HWin, NameBuffer, sizeof(NameBuffer))) { TMemo* Memo = reinterpret_cast <TMemo*> (MemoAddress); String NextLine; for(int i = 0; i < Nesting; i) NextLine = "-\t"; NextLine = NameBuffer; Memo->Lines->Add(NextLine); } //呼叫自己,執行再次一層的子視窗掃描, //直到沒有次一層子視窗為止 ::EnumChildWindows( HWin, reinterpret_cast <WNDENUMPROC> (EnumChildProc), MemoAddress ); //回至現子視窗 --Nesting; //傳回真值,告知執行下次handle掃描 return true; } //--------------------------------------------------------------------------- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |