![]() |
Virtueller Klick auf fremdes Fenster
Hi,
ich möchte eine andere Anwendung steuern. Leider werden mir mit WinSpy und XSpy nur das Fenster angezeigt. Jetzt dachte ich mir, ich mach einfach nen Mausklick auf den jeweiligen Button (wie bekomme ich eigentlich die Koordinaten?). Natürlich soll sich die Maus nicht wirklich bewegen und der Benutzer nichts davon mitkriegen. Wie kann ich also einen Klick simulieren in einer fremden Anwendung? |
Re: Virtueller Klick auf fremdes Fenster
Hallo,
ich glaube das ist das was du suchtst:
Delphi-Quellcode:
Gruß
procedure TForm1.Button1Click(Sender: TObject);
var wnd: THandle; btn: THandle; begin wnd := FindWindow(nil, 'Form1'); // sucht das Fenster btn := FindWindowEx(wnd, 0, 'TButton', 'Button2'); // sucht den Button If btn <> 0 then SendMessage(btn, BM_CLICK, 0, 0); // führt den Klick auf dem Button aus end; Mazel |
Re: Virtueller Klick auf fremdes Fenster
Die Anwendung die ich ansteuern möchte ist iTunes. Ich möchte den Play/Pause-Button drücken. Dieser wird mit den obengenannten Programmen nicht erkannt. D. h. ich kann deinen Code nicht gebrauchen. Was ich brauche ist eine Möglichkeit einen Klick irgendwo am Bildshcirm (mittels Koordinaten) auszuführen.
|
Re: Virtueller Klick auf fremdes Fenster
Ich habe jetzt über die Suche herausgefunden wie man einen Klick ausführt:
Delphi-Quellcode:
Das gefällt mir aber nicht weil der Anwender dann den Cursor hin und her wandern sieht. Außerdem weiß ich nicht wie ich der Anwendung den Focus geben kann (könnte ja ein anderes Fenster über iTunes liegen. Desweiteren weiß ich die Koordinaten ja nicht, weil das Fenster ja verschoben worden sein könnte. Wenn ich die Koordinaten der linken oberen Ecke ermitteln könnte, würde ich den Weg zum Button auch finden ;-)
mouse_event(MOUSEEVENTF_MOVE Or MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_ABSOLUTE,x,y,0,0);
mouse_event(MOUSEEVENTF_MOVE Or MOUSEEVENTF_LEFTUP Or MOUSEEVENTF_ABSOLUTE,x,y,0,0); kann mir da jemand helfen? |
Re: Virtueller Klick auf fremdes Fenster
Hallo,
versuch mal aus TButton -> Button zum machen. Eventuell hilft das, "Button2" ist die Caption also dann "Play" bzw. "Pause". Ansonsten weis ich auch nicht weiter. :( Gruß Mazel |
Re: Virtueller Klick auf fremdes Fenster
Zitat:
|
Re: Virtueller Klick auf fremdes Fenster
Anderer Ansatz: Du versuchst nicht den Button "virtuell" zu klicken sondern erzeugst gleich die Windows Message die sonst auch über den Button generiert werden würde.
|
Re: Virtueller Klick auf fremdes Fenster
Zitat:
|
Re: Virtueller Klick auf fremdes Fenster
Zumindest stellt Apple ein SDK zu Verfügung, mit dem man iTunes über c steuern kann.
Wahrscheinlich kann man das als Komponente auch in Delphi einbinden, wobei die Personal-Versionen von Delphi keine Option zum Importieren von Komponenten besitzen. Hier der Link: ![]() |
Re: Virtueller Klick auf fremdes Fenster
Der Shortcut für Start/Stop in ITunes ist die Leertaste.
Du kannst daher mal probieren, ein VK_SPACE der Anwendung zu senden. |
Re: Virtueller Klick auf fremdes Fenster
Zitat:
Hab's mal so probiert und es scheint zu funktionieren:
Delphi-Quellcode:
uses ComObj;
procedure TForm1.Button1Click(Sender: TObject); var iTunesApp: OLEVariant; begin // iTunes Objekt erzeugen iTunesApp := CreateOleObject('iTunes.Application'); if not VarIsNull(iTunesApp) then begin iTunesApp.Play; // iTunesApp.Pause; // iTunesApp.Stop; // iTunesApp.NextTrack; // am Ende... if not VarIsNull(iTunesApp) then iTunesApp := Unassigned; end; end; |
Re: Virtueller Klick auf fremdes Fenster
Zitat:
|
Re: Virtueller Klick auf fremdes Fenster
Das geht so:
Delphi-Quellcode:
Aufruf der Funktion:
function getCurrentTitle(iTunesApp: OleVariant) : string;
begin Result := iTunesApp.CurrentStreamTitle; if Result = '' then Result := iTunesApp.CurrentTrack.Name; end;
Delphi-Quellcode:
Label1.Caption := getCurrentTitle(iTunesApp);
|
Re: Virtueller Klick auf fremdes Fenster
Ich hab letztes Jahr geraume Zeit mit dem iTunes COM-Interface zugebracht und wollte daher mal ein paar kleine Tips einbringen:
- iTunes nimmt sich öfter mal die Freiheit, COM-Anforderungen zu ignorieren. Man sollte darauf gefasst sein, und den Aufruf ggf. nach ein paar Millisekunden Wartezeit wiederholen. - iTunes reagiert nicht auf COM-Aufrufe wenn der User gerade in iTunes was macht, auch darauf sollte man gefasst sein und entsprechend reagieren. - Wurde iTunes bereits über COM angesprochen, und sind COM-Events registriert, so signalisiert iTunes in der Regel "ich bearbeite jetzt erstmal keine COM-Anfragen mehr" und "ich bin jetzt wieder verfügbar". Es gab allerdings auch schon iTunes-Versionen in denen das kaputt war :) - Wurden COM-Events registriert, so scheint es nicht mehr möglich zu sein, die eigene Applikation sauber von iTunes abzukoppeln. Ob das bei den aktuellen Versionen immer noch so ist, müsste ich mal ausprobieren, im letzten Quartal 2006 wars auf jeden Fall noch so und hat mich einige graue Haare gekostet, weil das einzige was reproduzierbar ohne irgendwelche Crashes ging, ein "iTunesApp.Quit;" war :) |
Re: Virtueller Klick auf fremdes Fenster
Hallo,
ich habe bei mir aus dem oben genannten Beispiel folgendes gebastelt:
Delphi-Quellcode:
wenn ich auf dies nun zugreifen möchte erhalte ich die Meldung, das der Coinitialize nicht gefunden wurde. Nach ner weile goolgen und lesen habe ich erfahren, dass ich irgendwie OEVariants oder so iregndwie nach dem Com unterordnen muss aber schlau werde ich daraus nicht.
unit uItunes;
interface uses ComObj; //Itunes Com Port type tItunes = Class(tObject) public function getItunesVol: longint; function getCurrentTitle : string; Constructor Create; destructor free; protected private iTunesApp : OleVariant; end; implementation Constructor tItunes.Create; begin iTunesApp := CreateOleObject('iTunes.Application'); end; destructor tItunes.free; begin iTunesApp := Unassigned; end; function tItunes.getItunesVol: longint; begin Result := iTunesApp.SoundVolume; end; function tItunes.getCurrentTitle : string; begin Result := iTunesApp.CurrentTrack.Name + ' - ' + iTunesApp.CurrentTrack.artist; end; end. Auch dachte ich, den Fehler umgehen zu könne, indem ich das in eine eigene Unit packe aber diese Hoffnung wurde dann auch zerstört. kann mir jemand sagen, wie ich die Applikation schreiben muss, damit ich von aussen über getCurrentTitle und getItunesVol an verschiedenstellem im Ausgangsprogramm zugriffbekomme, ohne ständig irgendwelche Zugriffs- und Coinitializefehler zu produzieren? |
Re: Virtueller Klick auf fremdes Fenster
nun ja jetzt habe ich eine möglichkeit gefunden, wie ich die Itunes Daten im Mainprog an einer Stelle nur auslese, somit hab ich das Problem mit Coinitialize umgangen. aber das Gelbe vom Ei ist es irgendwie noch nicht wirklich.
Grüße Killerregenwurm |
Re: Virtueller Klick auf fremdes Fenster
Die eigentliche Frage ist noch immer offen: Wie kann ich virtuelle Klicks ausführen, ohne das der User den Cursor hin und her wandern sieht?
|
Re: Virtueller Klick auf fremdes Fenster
Zitat:
Delphi-Quellcode:
z.B. im initialization-Abschnitt deiner ausgelagerten Unit.
[url=http://msdn.microsoft.com/en-us/library/ms678543%28VS.85%29.aspx]CoInitialize(nil)[/url]
Dürfte doch bei deiner Suche auch bei jedem zweiten Post angemerkt worden sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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