Autor Beitrag
Swordooo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 119

W2K, Windows XP Professional
Delphi 2005 Personal, Delphi 7 Personal
BeitragVerfasst: Fr 31.07.09 10:03 
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
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 31.07.09 10:08 
Schau Dir mal WinSpy an, das generiert Dir auf Wunsch sogar den Code.
Swordooo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 119

W2K, Windows XP Professional
Delphi 2005 Personal, Delphi 7 Personal
BeitragVerfasst: Fr 31.07.09 10:25 
Danke werde ich testen
Lg
.50AE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
EnumChildWindows(FensterHandle, @EnumProc, 0);					


Den bestimmten Button kannst du nun entweder über die ControlID oder den Titel herausfinden.
ausblenden 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:
ausblenden 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.