2012-05-18 111 views
3

我想使用delphi編程訪問第三方應用程序的「文本框」,因此我需要使用FindWindowEx(...)函數找到每個「文本框」的句柄。如何獲取具有相同類名的不同控件的句柄?

問題是,由於所有的文本框與「無窗口名稱」都有相同的類名,所以此函數可以給我第一個TextBOx句柄!

如何在沒有名字的情況下獲取文本框句柄的其餘部分?

在此先感謝。

+2

我想你對FindWindowEx感興趣(PARENT_WINDOW_HANDLE,GW_HWNDNEXT,NIL,NIL) – ComputerSaysNo

+0

謝謝!但是「GW_HWNDNEXt」給出下一個控制句柄,它可能不是下一個文本框。 – Hesi

+0

是的,但他需要構建一個枚舉所有子窗口的遞歸函數,例如2個文本框可以是父窗口的子窗口,而其他文本框是另一個窗口的子窗口,因此他需要使用find首先,找到下一個... – ComputerSaysNo

回答

9

您可以使用EnumChildWindows來枚舉第三方應用程序窗口的所有子窗口,並測試每個枚舉窗口的類名以查看它是否爲「文本框」類。例如:

function EnumChildren(hwnd: HWND; lParam: LPARAM): BOOL; stdcall; 
const 
    TextBoxClass = 'EDIT'; (?) 
var 
    ClassName: array[0..259] of Char; 
begin 
    Result := True; 
    GetClassName(hwnd, ClassName, Length(ClassName)); 
    if ClassName = TextBoxClass then 
    TStrings(lParam).Add(IntToHex(hwnd, 8)); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Memo1.Clear; 
    EnumChildWindows(OtherAppWnd, @EnumChildren, UINT_PTR(Memo1.Lines)); 
end; 
+0

非常感謝你。只要你的代碼有一點變化,它就能很好地工作。 – Hesi

+0

對不起,我忘了點擊接受。 – Hesi

1

爲了使用FindWindowEx()有效,你需要知道窗口的UI結構時間提前,如通過間諜++,Winspector,或其他類似的工具。這樣你就知道有多少控件具有相同的類類型,他們的父/子關係是相互關聯的等等,所以你可以相應地編碼FindWindowEx()。或者,如果目標用戶界面使用對話ID(VCL不支持,但微軟通常會這樣做),那麼您可以直接使用GetDlgItem()直接獲取所需控件的句柄,而無需在代碼中搜索它們(同樣,Spy ++和類似的工具可以告訴你這些ID是什麼,所以你可以編碼它們)。

相關問題