![]() |
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:
[edit=Christian Seehase]Delphi-Tags korrigiert. Mfg, Christian Seehase[/edit]
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; |
Re: Button fremder Anwendungen drücken
Hallo,
um die Button-Handle herauszukriegen wirst Du wahrscheinlich nicht umhinkommen, dir hierfür auch mal das ![]() edit: ![]() |
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:
Wenn es sich bei dem Button um einen "normalen" Button handelt, kannst Du den auch mit der Message
Kind.Handle := FindWindowEx(Parent.Handle,0,nil,nil);
![]() |
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "Multimedia" nach "Windows API / MS.NET Framework API" verschoben.
Eher ein API-Problem |
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 ???? |
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 ![]() 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. |
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:
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.
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; |
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 |
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