9

DJ 用のプロプライエタリ ソフトウェア (Native Instruments Traktor) を少し使用しています。この種のことに慣れていない場合は、それを美化された iTunes と考えてください。オーディオ ファイルをブラウズして再生します。

このためのカスタム ファイル ブラウザ アプリケーションを構築したいのですが、API がありません。ただし、オーディオ ファイルをファイル システムからドラッグ アンド ドロップすることはできます。

私が設計しているファイル ブラウザーの性質上、実際にドラッグ アンド ドロップする必要はありません。アプリケーション内のコンポーネントをクリックするだけで、同じ効果が得られます。そのため、ファイル ブラウザー アプリケーションから、他のアプリケーションでドロップ イベントをプログラムでトリガーする方法を検討しています。

私が選んだプラットフォームは PyQt を使用した Python ですが、少しレベルを下げる必要があるかもしれないと感じ始めています。ただし、大量の C#/Java を行ったことがないため、少し学習曲線が必要になる可能性があります (ANSI C をたくさん行ったことがありますが、それはおそらくレベルです...)

これは私が持っている距離です:

  • 本当にシンプルな PyQt アプリケーションを作成しました
  • アプリケーションで QLabel をドラッグすると、QDrag オブジェクトを作成できます
  • 音声ファイルを表すすべての正しい MIME データをこれに添付できます
  • QLabel をアプリケーションから Traktor にドラッグ アンド ドロップすると、オーディオ ファイルが認識されて再生されます。

そこで、仲介者を切り取り、クリック時に MIME データをパッケージ化し、Traktor にドラッグ アンド ドロップしたと認識させる必要があります。

また、OSX 開発者のドキュメント、具体的には、ターゲット アプリケーション (ドロップ先) に渡されるメッセージのシーケンスを説明するこのようなものについても掘り下げました。

これはすべて理にかなっていますが、これらのメッセージを模倣するために C#/Java に移行しようとしています。

だから、その前に...

  1. これは可能ですか?それとも、ある種のクロスアプリセキュリティバリアなどにぶつかるでしょうか? (ドロップ先は、OS などから直接メッセージを受け入れるだけです)
  2. もしそうなら、それを行う簡単な方法はありますか?理想的には PyQt/Tkinter/wxPython で...?

クリック自動化でこれを行うことができることは知っていますが、実際には信頼性が低く、ウィンドウの位置などに大きく依存していると想像できます.

前もって感謝します!

4

3 に答える 3

2

これは試していませんが、CGEventCreateMouseEventやのようなものCGEventPostToPSNが役立つかもしれません。CGEvent.h と CGRemoteOperation.h

また、ターゲット アプリケーションがアップル イベントに応答するかどうかも疑問に思っています。応答する場合は、アップル イベントを作成して送信することができます。AppleScript Editor または Automator を実行して、問題のアプリで辞書を開いて、目的の動作をする可能性のあるイベントの辞書があるかどうかを確認します。

幸運。

于 2012-12-25T07:23:44.000 に答える
0

進捗!どのイベントがアプリケーションに配信されるかはまだわかりませんが、ファイル データがどこに保存されているかはわかります。ドラッグ ペーストボード上です。ファイルをどこかにドラッグしてから、これを実行してみてください:

#include <stdlib.h>
#import <Foundation/Foundation.h>
#import <AppKit/NSPasteboard.h>

int main(int argc, char **argv) {
    (void)argc, (void)argv;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSPasteboard *dragPasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];
    NSLog(@"%@", [dragPasteboard stringForType:(NSString *)kUTTypeFileURL]);
    [pool drain];
    return EXIT_SUCCESS;
}
于 2013-01-02T05:02:21.017 に答える