![]() |
Button in einer Anwendung drücken.
Hi
Ich schon wieder mit einer Frage. Ich versuche ein "Play" Button in einer Anwendung (Wahrscheinlich Java) zu drücken. Fragt mich bitte nicht wozu man es braucht, es ist für einen Kumpel. Es handelt sich um "SDRSharp" (Download hier: ![]() In der Anwendung möchte ich einfach nur das Play drücken. Bild: ![]() Meine Versuche sind leider gescheitert. Hier habe ich die Class mit WinSpy ausgelesen und so getestet.
Delphi-Quellcode:
Leider wird mein Button nicht gefunden.
procedure TForm1.Button1Click(Sender: TObject);
var wndMain, wndChild: HWND; i : Word; begin wndMain := FindWindow('WindowsForms10.Window.8.app.0.2004eee','SDR# v1.0.0.1337 - IQ Imbalance: Gain = 1,000 Phase = 0,000°'); if wndMain <> 0 then begin wndChild := FindWindowEx(wndMain, 0, 'WindowsForms10.BUTTON.app.0.2004eee', nil); (*Das Button OK bestimmen.*) PostMessage(199070, WM_KEYDOWN, VK_RETURN, 0); (*Drücke auf das Button OK.*) end; end; Dann habe ich versucht die ganzen HWND zu erfassen um zu testen ob mein Button vorhanden ist. Scheinbar ja, scheinbar ist die Class auch richtig aber es passiert nichts.
Delphi-Quellcode:
Ich komme nun nicht weiter.
function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND;
var i: Word; hChild: HWND; begin hChild := 0; Result := 0; Dec(ChildNr); for i := 0 to ChildNr do begin hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil); if hChild = 0 then Break; Result := hChild; end; end; procedure TForm1.Button2Click(Sender: TObject); var wndMain, wndChild, Jogi: HWND; begin wndMain := FindWindow('WindowsForms10.Window.8.app.0.2004eee','SDR# v1.0.0.1337 - IQ Imbalance: Gain = 1,000 Phase = 0,000°'); if wndMain <> 0 then begin wndChild := FindWindowEx2(wndMain,'WindowsForms10.Window.8.app.0.2004eee', 5); //Damit habe ich versucht die Gruppe zu erfassen. if wndChild <> 0 then begin Jogi := FindWindowEx2(wndChild,'WindowsForms10.BUTTON.app.0.2004eee', 5); //Das sollte eigentlich mein Button sein ShowMessage('Window Handle: ' + IntToStr(Jogi)); //Nur ein Test ob die HWND stimmt PostMessage(Jogi, WM_KEYDOWN, VK_RETURN, 0); //Drücke Play end; end; end; Das Ganze habe ich schon aufgegeben, meine Neugier aber hat mich zu der Frage bewegt. Ist es überhaupt in diesem Fall machbar? Vorschläge? |
AW: Button in einer Anwendung drücken.
Findet er denn alle controls?
|
AW: Button in einer Anwendung drücken.
Nein, das ist das Problem. Er sieht die Gruppe als eins.
Das hier Zitat:
Es sind aber mehrere Buttons vorhanden. EDIT: Falls Jemand sich die Mühe machen sollte. Das Programm ist kostenlos und man kann es in Sandbox installieren. Danach auch portabel benutzen. |
AW: Button in einer Anwendung drücken.
Davon abgesehen wäre BM_CLICK die passende Nachricht an die Schaltfläche,
|
AW: Button in einer Anwendung drücken.
Leider löst es aber mein Problem nicht.
Eine kurze Erklärung warum BM_CLICK besser ist wäre sehr nett. |
AW: Button in einer Anwendung drücken.
Weil das der offizielle Befehl ist, um einen Button zu drücken?
Und wenn es auf der Form einen "Default"-Button gibt, dann reagiert der auf Enter, und nicht der, an welchen man das [Enter] geschickt hat. :roll: Tipp: TButton.Default und TButton.Cancel |
AW: Button in einer Anwendung drücken.
Die Konstante ist eigentlich selbsterklärend. BM: Button Message. Click: Klicken. Und das willst du ja oder?
Nimm dir doch mal eins der vielen Tools und ermittele die ID des Buttons. Damit solltest du auch das Handle bekommen. |
AW: Button in einer Anwendung drücken.
EnumChildWindows wäre auch noch eine Idee. Da die Fenster wohl etwas verschachtelt sind.
|
AW: Button in einer Anwendung drücken.
Ja BM ist schon gut.
Ich habe es so weit dass wenn ich die Class Nr. direkt angebe klicke ich meinen Button.
Delphi-Quellcode:
Morgen versuche ich noch die Nummer automatisch zu erfassen.
SendMessage(1180958, BM_CLICK, 0, 0); // Das funktioniert
Bitte um Verständnis ich bin aber nur ein Anfänger. |
AW: Button in einer Anwendung drücken.
Das ist nicht die Class ID. Das ist das Handle! Und das ändert sich bei jedem Start der Anwendung.
|
AW: Button in einer Anwendung drücken.
Ja, das habe ich eigentlich gemeint, mit den Namen ist es so eine Sache.
Tatsache ist dass ich das Handle automatisch erfassen muss damit es funktioniert. Ich bleibe noch am Ball. Mal schauen was geht. EDIT: OK, wenn man genug experimentiert, kommt man dahinter wie es funktioniert. Das Problem war eben der Aufbau. Es sind im Tool 4 Button mit der Gleichen Parent Handle. Ja, ich habe den Fehler gemacht und gedacht habe jeder Button muss eine eigene Class ID haben. Nun bin ich dahinter gekommen. Ich lasse die Schleifen bis zu meinem Button durchlaufen. In meinem Fall die 1. ButtonPlay := FindWindowEx2(Gruppe,'WindowsForms10.BUTTON.app.0. 2004eee', 1); {Mein Button erfasse ich mit der 1} Das war's auch schon. Danke Euch für die Unterstützung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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