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

如何得到某個AP目前Focus的child window其中某個元件的Handle??

尚未結案
wivern
初階會員


發表:31
回覆:63
積分:28
註冊:2002-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-05 20:56:28 IP:61.219.xxx.xxx 未訂閱
請問一下,我想要抓到一個MDI應用程式目前focus的子視窗其中一個元件的handle, 這該怎麼做呢?? 我已經用FindWindow找到主視窗的Handle, 之後該怎麼做呢?? 看了站上一些文章, 有說到可以用RealChildWindowFromPoint來取得目前滑鼠座標的視窗的Handle, 還有別的辦法可以做嗎?? 我用SPY 看到我要抓的元件的Class是"SysListView32", 可以由這點去抓到我的的資料嗎?? 是不是要用EnumChildWindows這個API呢?? 我看了好多文章還是不太了解要怎麼用,能否教教我呢? 還有一個問題,那個child window上有兩個ListView, 我要怎麼知道哪一個才是我要的呢?? 一次問了一堆問題,真是不好意思,還請各位大大指點個方向~~ 小弟感激不盡!!
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-06 17:38:42 IP:218.160.xxx.xxx 未訂閱
不知這樣能不能解決你的問題?   TWinControl *a = FindControl(Handle);   for (int i=0;iControlCount;i ) { if (((TWinControl*)a->Controls[i])->Focused()) { ShowMessage(a->Controls[i]->Name); break; } }
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-06 17:41:34 IP:218.160.xxx.xxx 未訂閱
不知這樣能不能解決你的問題? TWinControl *a = FindControl(Handle); for (int i=0;i<a->ControlCount;i ) { if (((TWinControl*)a->Controls[i])->Focused()) { ShowMessage(a->Controls[i]->Name); break; } }
Cooky Kid
初階會員


發表:5
回覆:68
積分:44
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-06 19:08:19 IP:211.76.xxx.xxx 未訂閱
引言: 請問一下,我想要抓到一個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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-06 19:19:36 IP:211.76.xxx.xxx 未訂閱
引言: 請問一下,我想要抓到一個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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-10 10:35:58 IP:61.231.xxx.xxx 未訂閱
引言: 先解決您第一個疑問:如何抓到一個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;
}
//---------------------------------------------------------------------------
謝謝你的回應,我剛剛去買了這本書,準備好好的k一下~~ 希望能有所收獲~~
系統時間:2024-05-02 23:13:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!