Durch so was ähnliches habe ich mich auch gerade durchgekämpft
Ich gehe mal davon aus, dass du das Handle des Programms schon hast.
Dann benutzt du EnumChildWindows um alle Komponenten in dem Fenster zu finden.
Delphi-Quelltext
1:
| EnumChildWindows(FensterHandle, @EnumProc, 0); |
Den bestimmten Button kannst du nun entweder über die ControlID oder den Titel herausfinden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function EnumProc(wnd: HWND; Lines: TStrings): BOOL; stdcall; var ControlID: integer; Caption: string; begin Result := True; ControlID:= GetDlgCtrlID(wnd); Caption := GetWindowCaption(wnd); if (Caption = 'Speichern') then ButtonHandle := wnd; end; |
Um den Button zu drücken:
Delphi-Quelltext
1:
| SendMessage(GetParent(ButtonHandle),WM_COMMAND,MAKEWPARAM(GetWindowLong(ButtonHandle, GWL_ID), BN_CLICKED),ButtonHandle); |
Lg
//Edit: Achja, was mir auch noch schwierigkeiten bereitet hat: Wenn du den Button gleich beim Erstellen des Fensters drücken willst kann es passieren dass EnumChildWindows das Handle des Buttons noch nicht auflistet.
EnumChildWindows (MSDN)
| Zitat: |
| The function does not enumerate a child window that is destroyed before being enumerated or that is created during the enumeration process. |
Ich habe deshalb ein Sleep(50) eingefügt was bisher ganz gut funktioniert. Bei kleineren Werten als ~50ms ist das Problem weiterhin aufgetreten.