Auslöser-Ereignis bei einer anderen Anwendung in OSX auslösen

9

Ich benutze ein bisschen proprietäre Software für das DJing (Native Instruments Traktor). Wenn Sie mit so etwas nicht vertraut sind, denken Sie einfach an es als ein verklärtes iTunes: Es durchsucht und spielt Audiodateien.

Ich möchte dafür eine benutzerdefinierte Datei-Browser-Anwendung erstellen, aber es gibt keine API. Es tut erlaubt jedoch das Ziehen und Ablegen von Audiodateien aus dem Dateisystem, was ein guter Anfang ist.

Die Art des Dateibrowsers, den ich entwerfe, bedeutet, dass ich Dinge nicht wirklich per Drag & Drop bewegen muss - ich möchte nur auf eine Komponente in meiner Anwendung klicken und den gleichen Effekt haben. Also suche ich nach Möglichkeiten, programmgesteuert ein Drop-Ereignis in der anderen Anwendung aus meiner Datei-Browser-Anwendung auszulösen

Meine Plattform der Wahl ist Python mit PyQt, aber ich fange an zu glauben, dass ich etwas tiefer gehen muss. Hab noch nicht viel C # / Java gemacht, also könnte das ein bisschen eine Lernkurve sein (ich habe eine Menge ANSI C gemacht, aber das ist wahrscheinlich zu low level ...)

So weit habe ich:

  • Ich habe eine wirklich einfache PyQt-Anwendung erstellt
  • Ich kann ein QDrag-Objekt erstellen, wenn ein QLabel in meiner Anwendung gezogen wird
  • Ich kann alle korrekten MIME-Daten anhängen, um die Audiodatei auf diesem
  • darzustellen
  • Wenn ich also dieses QLabel aus meiner Anwendung in Traktor ziehe und dort ablege, erkennt es die Audiodatei und spielt sie ab - gute Zeiten

So, jetzt muss ich den mittleren Mann ausschneiden und, beim Klicken, meine MIME-Daten zusammenpacken und Traktor denken lassen, dass ich es gezogen und darauf fallen gelassen habe.

Ich habe mich auch eingehend mit den Dokumenten der OSX-Entwickler beschäftigt, insbesondere this stuff , das die Reihenfolge der Nachrichten beschreibt, die an die Zielanwendung (Ablageziel) übergeben werden.

Das macht alles Sinn, aber ich bin kurz davor, auf C # / Java herunterzufallen, um diese Nachrichten nachzuahmen, die wie ein Kaninchenloch klingen. Ich würde es lieber nicht wagen, wenn ich es vermeiden kann.

>

Also, bevor ich das tue ...

  1. Ist das überhaupt möglich? Oder werde ich irgendeine Art von Cross-App-Sicherheitsbarrieren usw. treffen? (Drop-Ziele akzeptieren nur Nachrichten direkt vom Betriebssystem oder etwas)
  2. Wenn ja, gibt es einen einfacheren Weg? Idealerweise mit PyQt / Tkinter / wxPython ...?

Ich weiß, dass ich das mit Click-Automation machen könnte, aber ich kann mir vorstellen, dass es wirklich unzuverlässig ist, massiv auf die Positionen von Fenstern usw. angewiesen zu sein.

Vielen Dank im Voraus!

    
Stu Cox 21.12.2012, 03:18
quelle

2 Antworten

2

Dies wurde nicht versucht, aber Dinge wie CGEventCreateMouseEvent und CGEventPostToPSN könnten hilfreich sein. CGEvent.h und CGRemoteOperation.h

Ich frage mich auch, ob die Zielanwendung möglicherweise auf Apple-Ereignisse reagiert - wenn dies der Fall wäre, könnten Sie Apple-Ereignisse erstellen und diese an sie senden, die sauberer wären. Ich würde versuchen, AppleScript Editor oder Automator auszuführen und das Wörterbuch in der fraglichen App zu öffnen, um zu sehen, ob es ein Wörterbuch mit Ereignissen enthält, die möglicherweise das tun, was Sie wollen.

Glück.

    
Dad 25.12.2012 07:23
quelle
0

Fortschritt! Während ich immer noch nicht weiß, welches Ereignis an die Anwendung geliefert wird, weiß ich, wo die Dateidaten gespeichert sind: Es ist auf der Dragpasteboard! Versuchen Sie, eine Datei irgendwo zu ziehen und dann folgendes auszuführen:

%Vor%     
icktoofay 02.01.2013 05:02
quelle