9

NSPasteBoardApple のドキュメントを読み、アプリケーションが に書き込みPasteBoard、他のアプリケーションがそのテキストを読み取って使用できるようにする方法について読みました。

アプリケーション(ステータスバーにある)からNSTextField別のアプリケーション内にあるテキストを貼り付ける方法を教えてください。

私がやろうとしているのは、SnippetSnippetsAppと似たようなことです。

私が完全に愚かで、Apple Docs で明白なことを見逃している場合は、正しい道を教えてください:)

ありがとう!

4

3 に答える 3

9

アプリケーション(ステータスバーにある)から別のアプリケーション内にある NSTextField にテキストを貼り付ける方法を教えてください。

貼り付けは、受信アプリケーションで行われることです。ペーストボードへの書き込みはコピーです。

さらに、ユーザーが NSTextField に貼り付けたいと考えることはできません。NSTextView、WebView のテキストエリア、Carbon EditText または MLTE コントロール、または Qt や wxWidgets テキスト エディターなどの他のテキスト エディターの場合があります。テキストを直接貼り付けられるリスト ビューを備えたアプリを使用している場合もあります。

そのため、アプリケーションに「ここにテキストがあります。貼り付けてください」と直接伝えるプログラム的な方法はありません。それを一般的なペーストボードにコピーしてから、一般的に最前面のアプリを貼り付けるイベントを作成する必要があります。チャーリーの ⌘V の提案は、トリッキーではありますが、1 つの方法です。Dvorak レイアウトでは V が別のキーに配置されますが、「Dvorak QWERTY ⌘」レイアウトでは V-with-⌘ (V-without-⌘ ではなく) が QWERTY の V と同じキーに配置されます。

その ⌘V イベントを偽造するには、 CGEventTap を調べます。関数を使用CGEventCreateKeyboardEventてイベント自体を作成する必要があります。その関数はキー コードを受け取るため、⌘V の組み合わせの V 部分の適切なキー コードを検索する必要があります。これにはTextを使用する必要があります。レイアウトに応じて、入力ソース サービスまたはキーボード レイアウト サービス。

この時点で、アクセシビリティを使用して [編集] メニューの [貼り付け] メニュー項目を見つけて AXPress メッセージを送信することを考えるかもしれませんが、「貼り付け」と「編集」はこれらの概念を表す英語の単語にすぎません。これを行った場合、アプリは他の言語では動作しません。順序 (3 番目のメニュー、6 番目のメニュー項目) で実行することもできますが、その場合、ファイル メニューがないアプリケーション、やり直しメニュー項目がないアプリケーション、または 2 つの元に戻すメニュー項目があるアプリケーション (Photoshop) ではアプリが動作しません。⌘V イベントを作成することは、実際に進むべき道です。

于 2010-04-22T16:07:27.053 に答える
8

⌘+key イベントを投稿するための作業コードを次に示します (既知のキーコードを想定)。

// some common keycodes
#define KEY_CODE_x ((CGKeyCode)7)
#define KEY_CODE_c ((CGKeyCode)8)
#define KEY_CODE_v ((CGKeyCode)9)

void DCPostCommandAndKey(CGKeyCode key)
{
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);

    CGEventRef keyDown = CGEventCreateKeyboardEvent(source, key, TRUE);
    CGEventSetFlags(keyDown, kCGEventFlagMaskCommand);
    CGEventRef keyUp = CGEventCreateKeyboardEvent(source, key, FALSE);

    CGEventPost(kCGAnnotatedSessionEventTap, keyDown);
    CGEventPost(kCGAnnotatedSessionEventTap, keyUp);

    CFRelease(keyUp);
    CFRelease(keyDown);
    CFRelease(source);  
}
于 2010-12-02T10:30:38.163 に答える
0

一般的に唯一の方法は、それを NSPasteboard に書き込んでから別のアプリに切り替え、いくつかの Carbon 関数を使用して「Command-V」を押すことです...

于 2010-04-21T08:32:17.747 に答える