2

AppleScript ではなく Apple イベントを使用して、テキストをアプリケーションに入力し、マウスをクリックする概念実証の Objective-C 実行可能ファイルはありますか?

たとえば、AppleScript に相当するもの

tell application "System Events"
 tell process "Safari"
  keystroke "Hello World"
  click
 end tell 
end tell

Mac OS X 10.9 で動作するはずで、できれば未来志向です (後方互換性は問題ではありません)。コンテキストは、別の言語から Objective-C コードを呼び出すことです。

私はそれを読んだので、私はこれを言っています:

Mac OS X 10.7 の時点で、低レベルの Cocoa API (NSAppleEventDescriptor) には依然として重要な機能 (Apple イベントを送信する機能など) が欠けていますが、高レベルの Cocoa API (スクリプト ブリッジ) には欠陥があり、実行するには限界があります。 appscript スタイルのラッパーの基礎。

と:

NSAppleScript はメインスレッドでのみ安全に使用できます

だから、私の目標は次のとおりです。

  1. 任意のアプリケーション (名前または現在の場合)
  2. キーボード入力またはマウス
  3. CまたはObjective-Cから
  4. 数百ミリ秒以内

ありがとう!

4

3 に答える 3

3

AppleEvents を使用する代わりに、CoreGraphics フレームワーク < https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html >の CGEvent API を使用すると、低レベルのマウスおよびキーボード イベントを投稿できます。ウィンドウサーバーへ。

#include <CoreGraphics/CoreGraphics.h>

NSArray *launchedApplications = [[NSWorkspace sharedWorkspace] launchedApplications]; // depreciated but I couldn't find a modern way to get the Carbon PSN
NSPredicate *filter = [NSPredicate predicateWithFormat:@"NSApplicationName = \"TextEdit\""];
NSDictionary *appInfo = [[launchedApplications filteredArrayUsingPredicate:filter] firstObject];
ProcessSerialNumber psn;
psn.highLongOfPSN = [[appInfo objectForKey:@"NSApplicationProcessSerialNumberHigh"] unsignedIntValue];
psn.lowLongOfPSN = [[appInfo objectForKey:@"NSApplicationProcessSerialNumberLow"] unsignedIntValue];

CGEventRef event1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, true); // 'z' key down
CGEventRef event2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, false); // 'z' key up

CGEventPostToPSN(&psn, event1);
CGEventPostToPSN(&psn, event2);

また、サービス < https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/SysServices/introduction.html > を作成することを検討することもできます。これにより、アプリケーションのサービス メニューを通じて他のアプリケーションに機能を提供できます。メニュー。サービス メニュー項目にキーボード ショートカットを割り当てることもできることに注意してください。サービスはシステムのペーストボードを介して機能します。あらかじめ用意されたデータや生成されたデータを別のアプリケーションに貼り付ける必要があるだけの場合は、生のウィンドウ サーバー イベントを処理するよりも、この方法の方が簡単かもしれません。

于 2014-09-21T20:54:37.250 に答える
1

結果を達成するための最良の方法は、Automator を使用することです。

https://developer.apple.com/library/mac/documentation/AppleApplications/Conceptual/AutomatorConcepts/AutomatorConcepts.pdfを参照して ください。

これを ObjectiveC で実現したい場合は、「分散オブジェクト アーキテクチャ」を理解する必要があります。NSPort と NSInvocation を組み合わせることで、クロスプロセスやマシン間のメソッド呼び出しなど、驚くべきことが可能になります。

そのためのガイドは次のとおりです
https://developer.apple.com/librarY/prerelease/mac/documentation/Cocoa/Conceptual/DistrObjects/Concepts/architecture.html

于 2014-09-21T11:19:29.820 に答える