Announcement

Collapse
No announcement yet.

handles von komponenten in fremden anwendungen bekommen ??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • handles von komponenten in fremden anwendungen bekommen ??

    Wenn ich z.B. mit Delphi ein programm schreibe, das nur ein Editfeld enthält und dann noch eins, welches versucht, mittels sendmessage(...WM_SETTEXT...) dort etwas hineinzuschreiben, wie könnte ich das realisieren ?? Mit enumwindows kann ich mir das fensterhandle ohne probleme geben lassen, wie komme ich jedoch an das handle des Editfeldes ??

    danke im voraus
    CRA

  • #2
    Hallo,

    als Beispiel füge ich eine Implementierung bei, mit der das Paßwort-Eingabefeld im AOL-Logindialog ausgefüllt wird. Um sicher zu gehen, daß tatsächlich das korrekte Eingabefeld "erwischt" wird, durchsucht das Programm die verschiedenen Fenster in genau der gleichen Reihenfolge, wie <b>WinSight</b> die Eigentumsverhältnisse auflistet:
    <pre>
    Overlapped xxx {AOL Frame25} xxxx "AOL"
    Child xxx {MDIClient} ......
    Child xxxx {AOLChild} .... "Anmelden"
    Child ....
    Child xxxxx {_AOL_Edit} ......
    </pre>
    - FindWindow sucht das Top-Level-Fenster der Zielanwendung über ihren Klassennamen (hier im Beispiel "AOL Frame25"), der von WinSight angezeigt wird. Über die auskommentierten SendMessage-Zeilen kann dies gleich getestet werden, indem das Fenster einen neuen Text in der Fensterzeile bekommt.

    - GetWindow(hAOLWnd, GW_CHILD) sucht das nachgeordnete Child-Fenster, in meinem Beispiel alos das MDIClient-Fenster von AOL.

    - GetWindow(hMDIWnd, GW_CHILD) sucht das Fenster des Login-Dialogs

    - FindWindowEx(hDlgWnd, 0, PChar('_AOL_Edit'), nil); sucht das Control im Login-Dialog, welches von der Fensterklasse "_AOL_Edit" abstammt. Auch diesen Klassennamen hat WinSight angezeigt.

    <pre>
    procedure TForm1.Button1Click(Sender: TObject);
    var
    hAOLWnd,
    hMDIWnd,
    hDlgWnd,
    hPwdWnd : hWnd;
    begin
    hAOLWnd := FindWindow('AOL Frame25', nil);
    if hAOLWnd <> 0 then
    begin
    //SendMessage(hAOLWnd, WM_SetText, 0, LongInt(PChar('AOL Frame')));
    hMDIWnd := GetWindow(hAOLWnd, GW_CHILD);
    if hMDIWnd <> 0 then
    begin
    //SendMessage(hMDIWnd, WM_SetText, 0, LongInt(PChar('AOL MDI')));
    hDlgWnd := GetWindow(hMDIWnd, GW_CHILD);
    if hDlgWnd <> 0 then
    begin
    hPwdWnd := FindWindowEx(hDlgWnd, 0, PChar('_AOL_Edit'), nil);
    MessageBeep(0);
    SendMessage(hPwdWnd, WM_SetText, 0, LongInt(PChar('Test')));
    end;
    end
    end;
    end;
    </pre&gt

    Comment

    Working...
    X