Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Handle: Button von app2 aus app1 klicken (https://www.delphipraxis.net/11653-handle-button-von-app2-aus-app1-klicken.html)

Praktikant 11. Nov 2003 12:27


Handle: Button von app2 aus app1 klicken
 
ich habe 2 Programme geschrieben, dabei wird app2 von app1 aus aufgerufen und wieder beendet.
Aber wie kann ich jetzt einen buttonklick (ist in app2) von app1 aus ausführen?
Bekommt der button einen eigenen handle?! Woher bekomme ich den.
Das Prog ist auf der Grundlage von Jens Schumanns Bsp.-Prog aufgebaut (s. http://www.delphipraxis.net/internal...ct.php?t=12085)

Christian Seehase 11. Nov 2003 18:26

Re: Handle: Button von app2 aus app1 klicken
 
Moin Praktikant,

ein normaler TButton hat ein Handle, dass Du, wie bei jedem anderen Fenster auch mit Hilfe, z.B. von FindWindow, bekommen kannst. Dann noch ein SendMessage mit BM_CLICK an diesen Button geschickt, und das war's.

Praktikant 12. Nov 2003 09:15

Re: Handle: Button von app2 aus app1 klicken
 
thx! Das ist meist mein großes Problem, die ganzen Befehle zu finden.
Gibt's da eine Bibliothek wo alle Handle Befhele drin stehen, da ja jedes Objekt mit einem anderen Befehl angesprochen wird.

Aber mein momentnes Problem ist noch, dass ich keine Handle Adresse zurück bekomme (immer 0), hab schon alles mögliche ausprobiert aber ändert sich nix.

Sieht inzwischen folgendermassen aus:
Delphi-Quellcode:
  for i:=1 to 100000 do                 //keine while mehr da sonst Endlosschleife
        hWindow := FindWindow(nil,'Kommunikation beenden');  //Caption des TButtons, Name geht aber auch nicht
  Sleep(1000);
  Label4.Caption:=IntToStr(hWindow);            //ausgeben der Handle Adresse
Wo ist mein grundlegender Fehler, habe den button auch schon an der vorderen stelle gehabt und auch mein formularname anstelle von nil eingetragen, aber nie findet er den button. Programm läuft natürlich schon!

Luckie 12. Nov 2003 13:56

Re: Handle: Button von app2 aus app1 klicken
 
Mit FindWindow das Hauptfenster finden, mit FindWindoEx den Button und dann ein BM_CLICKED schicken. Parameter der Befehle können hier: www.msdn.microsoft.com nachgeschlagen weden.

Sollte der Button nicht direkt auf dem Hauptfenster liegen hilft wohl nur noch eins, mit EnumChildWindows alle Kindfenster enumerieren, bis der Button gefundne wurde.

Praktikant 12. Nov 2003 15:53

Re: Handle: Button von app2 aus app1 klicken
 
ok, danke für den Hinweis mit FindWindowEx!
Bekomme jetzt auch ein Handle zurück, aber irgendwie nicht das Richtige.

Habe wieder herum probiert:
Bekomme mal ein Handle selbst wenn das Prog nicht läuft, bzw. mal geht er in die while-endlosschleife.
Wenn ich das Prog offen habe dann wechselt er bei jedem button klick die handle adresse, das ist doch auch nicht normal?!

Naja, wenn ich dann mit sendmessage mein bmclick schicke passiert zumindest nie etwas.

Mein Progaufbau sieht nun folgendermassen aus, wo habe ich da noch ein Fehler?
Delphi-Quellcode:
 
private
  ButtonKommBeendenHwnd : THandle;
[...]
var
  hWindow : DWORD;
  hButton : DWORD;
begin
  hWindow := 0;
  while hWindow = 0 do
    hWindow := FindWindow(nil,'FormKommunikation');
  // Die Child Windows durchgehen
  hButton := 0;
  while hButton = 0 do
  hButton := FindWindowEx (hWindow,ButtonKommBeendenHwnd,0,0); //ButtonKommBeenden ist Name des Button der geklickt werden soll
  // Wenn hButton <> 0 ist, wurde der Button gefunden
  Label4.Caption:=IntToStr(hButton);

  if hButton = 0 then exit;
  // und kann angeklickt werden
  SendMessage(hButton,BM_CLICK,0,0);
So wie der code jetzt steht scheint die handle adressierung zu funzen, nur mein prog reagiert nicht auf die sendmessage :(

Christian Seehase 12. Nov 2003 20:19

Re: Handle: Button von app2 aus app1 klicken
 
Moin Praktikant,

es könnte sein, dass der Button nicht direkt auf dem Formular, liegt, sondern auf einem anderen Element, das wiederum auf dem Formular liegt.
Such' hier mal nach Hier im Forum suchenEnumWindows, Hier im Forum suchenEnumChildWindows.
Da müsstest Du auf Beispiele stossen, wie man sich alle Fenster und Unterfenster heraussuchen lassen kann, sowie deren Caption, und Klassenname.

toms 12. Nov 2003 20:37

Re: Handle: Button von app2 aus app1 klicken
 
Sonst kannst du ja auch mal hier schauen.

Praktikant 13. Nov 2003 07:23

Re: Handle: Button von app2 aus app1 klicken
 
der Button liegt direkt auf dem Hauptformular, da ist kein Button oder sonstiges dazwischen. Ist ja mein Programm, von daher weiß ich das sicher ;)

Schau mir jetzt mal den link an und hoffe ich komme weiter.

Edit2:
Geschafft :-D
Nach weiteren 3Std. probieren hat es jetzt endlich geklappt.
Weiß zwar nicht 100% weshalb es vorher nicht funktioniert hat aber hauptsache es geht endlich.
Ein Problem war dass ich beim send/postmessage nicht den expliziten buttonnamen angegeben habe -> sendmessage(HandleForm,HandleButton,0,'Name des Buttons')

Dann noch ein paar if Abfragen, da u.a. die while Schleife nicht mehr durchlaufen werden darf wenn ich den Hanlde bekommen habe, dann findet er nämlich den Button nicht mehr :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz