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 Buttonklick in anderer Anwendung simulieren (https://www.delphipraxis.net/138609-buttonklick-anderer-anwendung-simulieren.html)

Tim-94 13. Aug 2009 15:27


Buttonklick in anderer Anwendung simulieren
 
Hi,
Ich habe eine "eigentlich" einfachere Frage.
Und zwar möchte ich auf einen Button in einer anderen Anwendung (iTunes) klicken.
Das Handle bekomme ich schon durch die Hilfe von WinSpy heraus.
Ich habe schon viel in Google und hier im Forum gesucht, das Thema wird öfters angesprochen und angeblich auch gelöst, aber leider haben diese Dinge in meinem Programm nie funktioniert.

Hier mein bisheriger Code (mit Hilfe von WinSpy):

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.PlayPauseButtonClick(Sender: TObject);
var
  wndMain, wndChild: HWND;
begin
  wndMain := FindWindow('iTunes','iTunes');
  if wndMain <> 0 then
  begin
    wndChild := FindWindowEx2(wndMain,'Button', 6);
    if wndChild <> 0 then
    begin
      SendMessage(wndChild, bm_Click,0,0);
    end;
  end;
end;
Vielen Dank im Vorraus :-D

alzaimar 13. Aug 2009 17:20

Re: Buttonklick in anderer Anwendung simulieren
 
Erstmal sollte die Message 'WM_Click' heißen und nicht 'bm_Click', denke ich. Und zum zweiten könnte es sein, das dem Control as am A* vorbei geht, weil es sich vielleicht gar nicht um einen Buttoni handelt, sondern um irgendeine Skin-Komponente.

Das sind natürlich nur Vermutungen, weil ich kein iTunes habe.

Tim-94 13. Aug 2009 17:33

Re: Buttonklick in anderer Anwendung simulieren
 
Aso, also könnte es sein, dass WinSpy dieses Objekt vielleicht nur fälschlicherweise als TButton erkennt.

Tim-94 13. Aug 2009 17:35

Re: Buttonklick in anderer Anwendung simulieren
 
Wenn ich die Eingenschaft auf wm_click ändere, spuckt Delphi die Fehlermeldung aus, dass der Bezeichner undefiniert ist.

alzaimar 13. Aug 2009 17:41

Re: Buttonklick in anderer Anwendung simulieren
 
Nee, vermutlich nicht.

Hier wird beschrieben, wie man iTunes per COM steuern kann. Vielleicht lässt sich dein Problem damit lösen?

WM_Click: Ich bin auch zu blöd und sollte das nächste Mal vorher nachschauen, bevor ich hier irgendwen verbessere. Entschuldigung.

Laut Delphi-Code kann man einem TButton eine CN_Command-Message schicken, wobei dann in lparam oder wParam der Wert 'BN_CLICKED' stehen muss.

Tim-94 13. Aug 2009 18:06

Re: Buttonklick in anderer Anwendung simulieren
 
Ja du hattest recht, ich habe meine Prozedur:

Delphi-Quellcode:
SendMessage(Handle, BM_Click, 0, 0);
mit dem Windows Taschenrechner ausprobiert und dort funktioniert es.
Also ist der Button in iTunes kein "echter" Button.

Das Problem liegt also bei WinSpy: Falsche Objektklassenerkennung!

mkinzler 13. Aug 2009 18:08

Re: Buttonklick in anderer Anwendung simulieren
 
Zitat:

Also ist der Button in iTunes kein "echter" Button.
iTunes scheint mir im Allgemeinen keine "echte" Windows-Oberfläche zu haben.

toms 13. Aug 2009 18:17

Re: Buttonklick in anderer Anwendung simulieren
 
Zitat:

Zitat von Tim-94
Das Problem liegt also bei WinSpy: Falsche Objektklassenerkennung!

Das stimmt nicht. Wenn der Klassenname falsch wäre, würde der Button nicht gefunden werden. Wird er aber.

Ich habe hier eine andere Möglichkeit gezeigt, um den Button anzusteuern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 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