1

ハイライトされたテキストをNSPasteboardのgeneralPasteboardにコピーして、ホットキーで応答するアプリケーションを作成しています。仮想キーストロークを送信するための解決策をここで探した後、私はこれを見つけました:「Cmd-C」キーストロークをobjective-cのアクティブなアプリケーションに送信する方法、またはアプリケーションにコピー操作を行うように指示する方法は?

NSAppleScriptで提案されたapplescriptを試しました。

NSLog(@"Hotkey Pressed");
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; 

NSAppleScript *playScript;
playScript = [[NSAppleScript alloc] initWithSource:@"tell application \"System Events\" to keystroke \"c\" using command down"];

if([playScript isCompiled] == NO){
[playScript compileAndReturnError:nil];
}

id exerror = [playScript executeAndReturnError:nil];

if(exerror == nil){
 NSLog(@"Script Failed");
}

動作しますが、初めてホットキーを押したときだけです。後続の各ヒットは、強調表示されたテキストを取得しません。generalPasteboardには、スクリプトを再実行する前と同じ内容が含まれています。コードを実行する前にgeneralPasteboardをクリアしても意味がありません。これは、ペーストボードの内容を読み取ろうとするとコードが失敗するためです。ログは次のとおりです。

 Pastify[16929:a0b] woooooooo! I'm being CALLED
 Pastify[16929:a0b] Hotkey Pressed
 Pastify[16929:a0b] Error loading /Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types:  dlopen(/Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types, 262): no suitable image found.  Did find:
    /Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types: no matching architecture in universal wrapper
 Pastify: OpenScripting.framework - scripting addition "/Library/ScriptingAdditions/Adobe Unit Types.osax" declares no loadable handlers.
 Pastify[16929:a0b] Size of copiedItems: 1
 Pastify[16929:a0b] Content of paste: 2010-04-19 03:41:04.355 Pastify[16929:a0b] woooooooo! I'm being CALLED
 Pastify[16929:a0b] Hotkey Pressed
 Pastify[16929:a0b] Size of copiedItems: 1
 Pastify[16929:a0b] Content of paste: 2010-04-19 03:41:04.355 Pastify[16929:a0b] woooooooo! I'm being CALLED
 Pastify[16929:a0b] Hotkey Pressed
 Pastify[16929:a0b] Size of copiedItems: 1
 Pastify[16929:a0b] Content of paste: 2010-04-19 03:41:04.355 Pastify[16929:a0b] woooooooo! I'm being CALLED

だから私は次の提案された解決策を試しました:

 CFRelease(CGEventCreate(NULL));

 CGEventRef event1, event2, event3, event4;
 event1 = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)50, true);
 event2 = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)8, true);
 event3 = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)8, false);
 event4 = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)50, false);

 CGEventPost(kCGHIDEventTap, event1);
 CGEventPost(kCGHIDEventTap, event2);
 CGEventPost(kCGHIDEventTap, event3);
 CGEventPost(kCGHIDEventTap, event4);

上記はキーストロークCommand+cを送信するはずですが、私が得るのはビープ音だけで、ペーストボードの内容は変更されていません。

私は機知に富んでいます-誰かが私が欠けているものについて私に教えてくれたり、私がとても単純なもののために見落としているものを指摘したりできますか?

4

3 に答える 3

1

このためのサービスを利用できない理由はありますか?

イベントを合成して本当にやりたい場合は、ダウン/アップではなく、変更されたキーボードイベントを投稿するのが最善の策です。詳細については、この質問を参照してください。

MacOSXでのキー押下イベントのシミュレーション

それがうまくいかない場合は、まあ、あなたは私を見つける場所を知っています:-)

于 2010-04-19T17:32:30.843 に答える
1

考えてみてください...cmd-cトリックは最前面のアプリケーションで機能します。初めてホットキーを実行してこれをトリガーすると、適切なアプリケーションが最前面にあり、cmd-cが機能し、アプリケーションがペーストボードで何かを実行するのではないかと思います。2回目の実行でホットキーがアクティブになりますが、前のアプリケーションは最前面ではなくなったため、cmd-cは機能しません。本質的には、cmd-cを他のアプリケーションに送信していることになります。たぶん、あなたのアプリケーションは前面に出てきたのかもしれません。

この問題を回避するには、対象のアプリケーションが最前面にあることを確認する必要があります。したがって、最初に最前面のアプリケーションが何であるかを確認する方法が必要です。次に、cmd-cを実行する直前に、そのアプリケーションをアクティブ化します。たとえば、applescriptで、Safariでcmd-cを実行する場合は、次を使用します。

tell application "Safari" to activate
tell application "System Events" to keystroke "c" using command down
于 2010-04-19T10:05:26.550 に答える
0

なぜこれを行っているのかはよくわかりませんが、イベントが特定のプロセスに送られるようにしたい場合は、CGEventPostの「ToPSN」バリアントを使用してください。

于 2010-04-19T17:45:01.033 に答える