Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Button in einer Anwendung drücken. (https://www.delphipraxis.net/184920-button-einer-anwendung-druecken.html)

IMPEGA 30. Apr 2015 11:39

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: http://sdrsharp.com/#download)

In der Anwendung möchte ich einfach nur das Play drücken.
Bild: http://www.xup.in/dl,19032894/SDR.JPG/

Meine Versuche sind leider gescheitert.
Hier habe ich die Class mit WinSpy ausgelesen und so getestet.
Delphi-Quellcode:
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;
Leider wird mein Button nicht gefunden.
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:
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;
Ich komme nun nicht weiter.
Das Ganze habe ich schon aufgegeben, meine Neugier aber hat mich zu der Frage bewegt.
Ist es überhaupt in diesem Fall machbar?
Vorschläge?

Dejan Vu 30. Apr 2015 16:06

AW: Button in einer Anwendung drücken.
 
Findet er denn alle controls?

IMPEGA 30. Apr 2015 17:05

AW: Button in einer Anwendung drücken.
 
Nein, das ist das Problem. Er sieht die Gruppe als eins.
Das hier
Zitat:

WindowsForms10.BUTTON.app.0.2004eee
Zumindest zeigt er nur eine Message.
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.

Luckie 30. Apr 2015 18:52

AW: Button in einer Anwendung drücken.
 
Davon abgesehen wäre BM_CLICK die passende Nachricht an die Schaltfläche,

IMPEGA 30. Apr 2015 19:29

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.

himitsu 30. Apr 2015 19:51

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

Luckie 30. Apr 2015 20:54

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.

Luckie 30. Apr 2015 20:56

AW: Button in einer Anwendung drücken.
 
EnumChildWindows wäre auch noch eine Idee. Da die Fenster wohl etwas verschachtelt sind.

IMPEGA 30. Apr 2015 21:29

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:
SendMessage(1180958, BM_CLICK, 0, 0); // Das funktioniert
Morgen versuche ich noch die Nummer automatisch zu erfassen.

Bitte um Verständnis ich bin aber nur ein Anfänger.

Luckie 30. Apr 2015 21:50

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Seite 1 von 2  1 2      

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