16

任意のアプリケーションでCMD+CTRL + Dを押すと、選択したテキストの次のポップアップダイアログが辞書アプリにどのように表示されるかを調べるのに助けが必要です。ココアアプリにも同じ種類の機能を実装したいと思います。アプリはバックグラウンドで実行され、選択したテキストのホットキーを押すと提案が表示されます。

辞書アプリのホットキー提案ダイアログ

ホットキーキャプチャをすでに実装しています。選択したテキストの長方形の領域を画面に表示するためのコードが必要なだけなので、辞書アプリのようにダイアログを表示できます。

ありがとう

4

3 に答える 3

21

そのためにアクセシビリティAPIを使用できます。[支援機器のアクセスを有効にする]設定がオンになっていることを確認します([システム環境設定] / [ユニバーサルアクセス]で)。

次のコードスニペットは、ほとんどのアプリケーションで選択されたテキストの境界(画面座標)を決定します。残念ながら、メールとサファリはプライベートアクセシビリティ属性を使用しているため、機能しません。そこでも動作させることはおそらく可能ですが、より多くの作業と、場合によってはプライベートAPI呼び出しが必要になります。

AXUIElementRef systemWideElement = AXUIElementCreateSystemWide();
AXUIElementRef focussedElement = NULL;
AXError error = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute, (CFTypeRef *)&focussedElement);
if (error != kAXErrorSuccess) {
    NSLog(@"Could not get focussed element");
} else {
    AXValueRef selectedRangeValue = NULL;
    AXError getSelectedRangeError = AXUIElementCopyAttributeValue(focussedElement, kAXSelectedTextRangeAttribute, (CFTypeRef *)&selectedRangeValue);
    if (getSelectedRangeError == kAXErrorSuccess) {
        CFRange selectedRange;
        AXValueGetValue(selectedRangeValue, kAXValueCFRangeType, &selectedRange);
        AXValueRef selectionBoundsValue = NULL;
        AXError getSelectionBoundsError = AXUIElementCopyParameterizedAttributeValue(focussedElement, kAXBoundsForRangeParameterizedAttribute, selectedRangeValue, (CFTypeRef *)&selectionBoundsValue);
        CFRelease(selectedRangeValue);
        if (getSelectionBoundsError == kAXErrorSuccess) {
            CGRect selectionBounds;
            AXValueGetValue(selectionBoundsValue, kAXValueCGRectType, &selectionBounds);
            NSLog(@"Selection bounds: %@", NSStringFromRect(NSRectFromCGRect(selectionBounds)));
        } else {
            NSLog(@"Could not get bounds for selected range");
        }
        if (selectionBoundsValue != NULL) CFRelease(selectionBoundsValue);
    } else {
        NSLog(@"Could not get selected range");
    }
}
if (focussedElement != NULL) CFRelease(focussedElement);
CFRelease(systemWideElement);
于 2011-07-10T16:41:21.513 に答える
3

ここでは、Swiftで@omzの回答を求めます

    let systemWideElement = AXUIElementCreateSystemWide()
    var focusedElement : AnyObject?

    let error = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute as CFString, &focusedElement)
    if (error != .success){
        print("Couldn't get the focused element. Probably a webkit application")
    } else {
        var selectedRangeValue : AnyObject?
        let selectedRangeError = AXUIElementCopyAttributeValue(focusedElement as! AXUIElement, kAXSelectedTextRangeAttribute as CFString, &selectedRangeValue)
        if (selectedRangeError == .success){
            var selectedRange : CFRange?
            AXValueGetValue(selectedRangeValue as! AXValue, AXValueType(rawValue: kAXValueCFRangeType)!, &selectedRange)
            var selectRect = CGRect()
            var selectBounds : AnyObject?
            let selectedBoundsError = AXUIElementCopyParameterizedAttributeValue(focusedElement as! AXUIElement, kAXBoundsForRangeParameterizedAttribute as CFString, selectedRangeValue!, &selectBounds)
            if (selectedBoundsError == .success){
                AXValueGetValue(selectBounds as! AXValue, .cgRect, &selectRect)
                //do whatever you want with your selectRect
                print(selectRect)
            }
        }
    }
于 2020-02-04T01:05:30.140 に答える
-2

あなたが探しているのはサービスです。 サービスを使用すると、アプリを実行したり、グローバルホットキーをキャプチャしたりする必要もありません。

たとえば、説明した辞書アプリの機能は実際にはサービスであり、[サービス]メニューで確認できます。

辞書サービスメニュー

Appleのサービス実装ガイドは、おそらくそこにあるサービスに関する最良の情報です。

于 2011-07-04T21:28:28.840 に答える