2

I have a menubar application without a dock icon or global menu, it's just a StatusItem and a Window.

I've got it wired up to a hotkey which activates the window and upon deactivating the window I am able to send focus back to the previously active application.

How can I send an NSString to the active textarea in the other application, as if the user had typed it directly?

I think it might be possible using accessibility features. I'd like to avoid using AppleScript if at all possible.

4

2 に答える 2

1

フォーカスされたUI要素から、次の2つを取得する必要があります。

さて、簡単なアプローチはこれら2つの属性を取得することですが、それは実際には間違った解決策です。

問題は、value属性の値がプレーンな文字列であるということです。要素がリッチテキストビューの場合、ユーザーが持っている可能性のある書式設定や埋め込みオブジェクトはすべて失われます。それは悪いことです。

したがって、値を取得する正しい方法は、要素の文字数を取得し、その数を長さとしてゼロから始まる範囲を作成し、その範囲の属性付き文字列を取得することです。それが失敗した場合は、プレーンな値を取得します。

値(属性付き文字列またはプレーン文字列)と選択した範囲の両方を取得したら、値内の選択したテキスト範囲を挿入するテキストに置き換えます。ユーザーが何も選択していない場合、範囲は挿入ポイントの位置で空の範囲(長さゼロ)になり、置換は事実上挿入になります。

次に、要素の値を修正した文字列に設定します。(属性付き文字列に設定することだけが機能することを期待できます。)

于 2013-01-13T10:02:15.993 に答える
0

I ended up using the pasteboard and CGEventCreateKeyboardEvent() to mimic the [cmd+v] keyboard shortcut for pasting.

Before activating my window, I record the previous application:

_previousApplication = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];

After I dismiss my window, I activate the previous application:

[_previousApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];

Then paste the NSString:

#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);
}

DCPostCommandAndKey(KEY_CODE_v);
于 2013-02-24T00:39:38.420 に答える