3

Delphi プログラミングを使用してサードパーティ アプリケーションの「テキスト ボックス」にアクセスしようとしているため、FindWindowEx(...) function を使用して各「テキスト ボックス」のハンドルを見つける必要があります。

問題は、すべてのテキスト ボックスが「ウィンドウ名なし」の同じクラス名を持っているため、この関数は最初の TextBOX ハンドルを取得できることです。

名前のない残りのテキスト ボックス ハンドルを取得するにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

10

を使用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;
于 2012-05-18T15:31:12.670 に答える
1

効果的に使用するにFindWindowEx()は、Spy++ や Winspector などのツールを使用して、ウィンドウの UI の構造を事前に把握しておく必要があります。そうすれば、同じクラス タイプを持つコントロールの数、相互の親子関係などがわかるため、それFindWindowEx()に応じてコーディングできます。または、ターゲット UI がダイアログ ID を使用する場合 (VCL は使用しませんが、Microsoft は通常使用します)、GetDlgItem()代わりに使用して、目的のコントロールのハンドルをコードで探すことなく直接取得できます (ここでも、Spy++ と同様のツールを使用すると、それらの ID が何であるかを表示できるので、コード化できます)。

于 2012-05-18T19:16:04.427 に答える