- FindWindow または EnumWindows を使用して、ターゲット アプリケーションのトップ レベル ウィンドウを見つけます。
- EnumChildWindows を呼び出して、最上位ウィンドウのすべての子を列挙します。
- 列挙型コールバックで GetClassName を使用して、目的のウィンドウ クラスを確認します。たとえば、生の Win32 編集ウィンドウの場合は EDIT になります。
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;
これはドキュメントで明確にされています。EnumChildWindows
残念ながら、 inの宣言はWindows.pas
、コールバック関数の型安全性を完全に放棄します。したがって、コンパイラの助けを借りずに正しく処理する必要があります。
HWND
とTHandle
は同じものではないことにも注意してください。それらを混同しないでください。