Entwickler-Ecke

Windows API - Handle vom Button bekommen


Swordooo - Fr 31.07.09 10:03
Titel: Handle vom Button bekommen
Gute Morgen ;)
Ich Möchte von einer Fremdanwendung das Handle von einem Button bekommen, wie mach ich das am besten?
Wär echt nett, wenn Ihr mir helfen könnt.

MfG Swordooo


Delete - Fr 31.07.09 10:08

Schau Dir mal WinSpy an, das generiert Dir auf Wunsch sogar den Code.


Swordooo - Fr 31.07.09 10:25

Danke werde ich testen
Lg


.50AE - Fr 07.08.09 23:40

Durch so was ähnliches habe ich mich auch gerade durchgekämpft :D

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//Child Fenster (Dialog Fenster)
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) [http://msdn.microsoft.com/en-us/library/ms633494(VS.85).aspx]
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.