2012-10-17 73 views
1

我有一個窗口,裏面有兩個文本字段。如何查找窗口中的所有文本字段?

如何獲得使用WinAPI調用的兩個文本字段的句柄?

注意:這兩個文本框屬於不同的應用程序(我在應用程序A中進行WinAPI調用,文本框位於應用程序B中)。

更新1:

調用GetClassName當我得到Invalid window handle消息。

我想我的回調函數聲明有問題。

EnumChildWindows是從的TMyClass這樣的方法之一調用:

EnumChildWindows(handle, @TMyClass.CBList, 0); 

這裏的回調函數的代碼。

function TMyClass.CBList(Win: THandle; lp: LPARAM): Boolean; stdcall; 
var 
    ClassName:array [1..1024] of Char; 
begin 
    GetClassName(Win, PChar(@ClassName), 1024); 
    OutputDebugString(PChar('SysErrorMessage(GetLastError): ')); 

    result := true; 
end; 
+0

你可以使用構造函數返回的句柄嗎? – ammar26

+0

我有以下情況:我在Delphi中有應用程序A,此應用程序通過WinAPI與應用程序B交互。我有應用程序A的源代碼,但不是應用程序B的源代碼。 因此 - 不,我不能從構造函數中獲取這些值,因爲它們在應用程序B中。 –

+0

應用程序B也是用Delphi編寫的。 –

回答

5
  1. 使用FindWindow函數或EnumWindows的找到目標應用程序的頂層窗口。
  2. 調用EnumChildWindows枚舉頂層窗口的所有子項。
  3. 在枚舉回調中,使用GetClassName檢查所需的窗口類。例如,它將編輯一個原始的Win32編輯窗口。

使用像Spy ++這樣的工具來理解目標應用程序的結構,並找出它使用的精確窗口類名稱。


你在如何調用GetClassName意見的問題讓我思考。如果你正在使用XE3,你可以寫HWND一個簡單的記錄類型的輔助,使其語法清潔得到的類名持有:

type 
    THWNDHelper = record helper for HWND 
    private 
    function GetClassName: string; 
    public 
    property ClassName: string read GetClassName; 
    end; 

function THWNDHelper.GetClassName: string; 
var 
    Buffer: array [0..255] of Char; 
begin 
    if Winapi.Windows.GetClassName(Self, @Buffer, Length(Buffer))=0 then 
    RaiseLastOSError; 
    Result := Buffer; 
end; 

然後你就可以寫hwnd.ClassName獲取窗口類名。當然,如果你不使用XE3你可以做這樣的:

function GetWindowClassName(hwnd: HWND): string; 
var 
    Buffer: array [0..255] of Char; 
begin 
    if GetClassName(hwnd, @Buffer, Length(Buffer))=0 then 
    RaiseLastOSError; 
    Result := Buffer; 
end; 

請注意,我用的,因爲窗口類名長度256的緩衝區長度被限制爲比不再。


關於更新中的代碼,您不能使用實例方法進行回調。回調必須聲明如下:

function EnumChildWindowsCallback(hwnd: HWND; lParam: LPARAM): BOOL; stdcall; 
begin 
    OutputDebugString(PChar(GetWindowClassName(hwnd))); 
    Result := True; 
end; 

這在documentation明確。不幸的是Windows.pasEnumChildWindows的聲明完全放棄了回調函數的類型安全性。所以你必須在沒有編譯器幫助的情況下做對。

還要注意的是,HWNDTHandle不是一回事。不要混淆。

+0

第3步:這是將當前控件的類名讀入ClassName變量的正確方法嗎? 'GetClassName(Win,PAnsiChar(ClassName),1024)'其中'ClassName:array [1..1024] of Char;'。 –

+1

使用'PChar(@ClassName)'或'@ClassName [1]'作爲第二個參數。 –

+0

如何在調試輸出中打印'ClassName'? 'OutputDebugString(PChar('ClassName:'+ ClassName));'不起作用(產生類似於'ClassName:'的輸出)。 –

相關問題