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 Button fremder Anwendungen drücken (https://www.delphipraxis.net/82714-button-fremder-anwendungen-druecken.html)

egon.kaschuba 18. Dez 2006 17:31


Button fremder Anwendungen drücken
 
:(


Hallo,

Ich möchte gern den Button fremder Anwendungen ermitteln.

Z.B.: Aus meiner Delphi Anwendung ein fremders Programm aufrufen,und dann dem
Programm eine neue Tastenkomination schicken.

Bekomme aber immer den Hinweis : Inkompatible Typen HWND und Pointer.
Weiß jemand eine lösung des Problems ??


Vielen Dank

Delphi-Quellcode:
   procedure TForm1.Button1Click(Sender: TObject);
    begin

   FindWindowEx(Parent.Handle,nil,nil,nil);

   PostMessage(Handle.Kind,WM_LBUTTONDOWN,MK_LBUTTON,0);
  PostMessage(Handle.Kind,WM_LBUTTONUP,0,0);
 end;
[edit=Christian Seehase]Delphi-Tags korrigiert. Mfg, Christian Seehase[/edit]

TStringlist 18. Dez 2006 18:05

Re: Button fremder Anwendungen drücken
 
Hallo,

um die Button-Handle herauszukriegen wirst Du wahrscheinlich nicht umhinkommen, dir hierfür auch mal das Bei Google suchenSpyXX von Microsoft zu besorgen. Damit kannst Du dann z.B. auch auslesen, über welche Child-Windows der Application Du dich dann u.U. auch entlanghangeln musst bis zu deinem Wunsch-Button (immer schön mittels FindWindowEx). ...Und anstelle von WM_LButtonDown etc. dann event. auch besser gleich die ButtonMessage "BM_Click" abschicken.


edit: Spy++ ist zwar von MS, kostet aber (trotzdem) nix. Das Prog zeigt dir dann z.B. auch den Button-Namen, der ja fürs Suchen per FindWindowEx auch durchaus nützlich/notwendig ist.

Christian Seehase 18. Dez 2006 18:10

Re: Button fremder Anwendungen drücken
 
Moin Egon,

als zweiten Parameter erwartet FindWindowEx ein Handle.
Soll hier keines angegeben werden, so muss Du 0 hinschreiben.
Das ist das, was Dir der Compiler anmeckert.

So wie Du es aufrufst, wirst Du damit aber wohl auch nicht glücklich, denn der Rückgabewert von FindWindowEx ist das gesuchte Handle, also solltest Du das auch speichern. Ansonsten wäre der gesamte Funktionsaufruf sinnlos.

Bei Handle.Kind ist wohl ein Dreher drin (Kind.Handle?)

Es könnte so gemeint sein, oder?
Delphi-Quellcode:
Kind.Handle := FindWindowEx(Parent.Handle,0,nil,nil);
Wenn es sich bei dem Button um einen "normalen" Button handelt, kannst Du den auch mit der Message MSDN-Library durchsuchenBM_CLICK ansprechen, was sicherer funkioniert als einen Mausklick zu simulieren.

DP-Maintenance 18. Dez 2006 18:11

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Multimedia" nach "Windows API / MS.NET Framework API" verschoben.
Eher ein API-Problem

egon.kaschuba 18. Dez 2006 18:39

Re: Button fremder Anwendungen drücken
 
:(
Hallo Chris,
mit der null war schon OK.

PostMessage(Handle.Kind .... u.s.w Schuss innen Ofen.

Aber nu kommt Record,Object oder Klassentyp erforderlich.
Alle meine Kinder hab ich hin und her getauscht
Verzei: Bin ich zu dusselig oder macht das, daß Alter ????

Christian Seehase 18. Dez 2006 22:31

Re: Button fremder Anwendungen drücken
 
Moin Egon,

ich denke mal, es macht die mangelnde Erfahrung...

Zum einen:
Wie ist denn bei Dir Handle, das Du in PostMessage verwendet hast, deklariert?

Allerdings möchte ich mich auch noch einmal vergewissern, dass das was Du da geschrieben hast, auch das ist, was Du willst:

Als ersten Parameter von FindWindowEx verwendest Du Parent.Handle.
Da Du Dich in einer Methode von Form1 befindest, und ein Formular eine Eigenschaft Parent hat, übergibst Du den Wert des Handles des Parents von Form1, was, i.d.R. dem Application-Window der Anwendung entspricht.
Jedes VCL-Programm hat als oberste Ebene ein unsichtbares Application-Window, das als Parent für die Unterfenster (Form1...) dient, solange man nicht manuell eingreift.

Da Du ja den Button einer Fremdandwendung ansprechen willst, bin ich mir also nicht ganz sicher, ob das so sein soll, zumal sich auf dem Fenster garantiert kein Button befindet.

Um einen bestimmten Button in einer Fremdanwendung zu finden, wirst Du wahrscheinlich mit Hier im Forum suchenEnumChildWindows weiterkommen.
Das Handle mittels eines anderen Tools auszulesen hilft Dir zur Laufzeit Deines Programmes nicht viel weiter, da sich der Wert bei jedem Erzeugen des Buttons ändern kann.

TStringlist 19. Dez 2006 08:54

Re: Button fremder Anwendungen drücken
 
...also, hier vielleicht doch mal ein Mini-Beispiel das zeigt, wie absolut einfach das auch mit FindWindowEx sein kann.

Angenommen Du möchtest die Pie-Button auf deinem Taschenrechner-Prog ferngesteuert niederdrücken, dann reicht nämlich schon ungefähr folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var RechnerHwnd, PiTasteHwnd : THandle;
begin
  RechnerHwnd := FindWindow('SciCalc','Rechner');
  if RechnerHwnd > 0 then
    PiTasteHwnd := FindWindowEx(RechnerHwnd,0,'Button','Pi');

  if (RechnerHwnd > 0) and (PiTasteHwnd > 0)
  then PostMessage(PiTasteHwnd,BM_Click,0,0)
  else showMessage('..klappte nicht!');
end;
Vorher schaust Du dir aber noch mittels Spy++ (=SpyXX) die einfache Control-Struktur des Progs an, ...und siehst dabei zufällig, dass nicht nur der Taschenrechner schon einen sinnvollen Namen (='Rechner') hat, sondern dass ’günstigerweise’ auch die Buttons darauf ihren Funktionen entsprechend benannt sind. Außerdem kannst du auch nur mittels eines solchen Tools die ebenfalls noch benötigten Klassennamen von Prog u. Button herausbekommen.

hanspeter 19. Dez 2006 09:06

Re: Button fremder Anwendungen drücken
 
Ich hatte doch per email als Antwort auf die Anfrage zur MP3 Ausgabe ein Stück
Quellcode geschickt, welcher genau dieses macht.
Funktioniert, einfach kopieren.


Gruß Peter

egon.kaschuba 20. Dez 2006 20:14

Re: Button fremder Anwendungen drücken
 
:kiss:
Hallo an alle drei,

habe das Problem gelöst.

Vielen Dank und frohe Weihnachten

Gruß egon


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr.

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