Скопируйте выделенный текст с помощью Swift

Я пишу всплывающее меню в OS X.

Цель состоит в том, чтобы скопировать выделенный текст текущего активного приложения (не моего всплывающего окна) в мое приложение, чтобы я мог использовать его как строку.


person Aaron    schedule 19.01.2016    source источник


Ответы (2)


Класс NSPasteboard используется для размещения/получения информации на монтажном столе. Насколько я понимаю, вы хотите получить текущий выделенный текст в другом приложении в строку в вашем приложении. API специальных возможностей для достижения этой цели.

Вы можете отправить ключи в другое приложение, чтобы вы могли отправить Cmd-C в другое приложение, а затем извлечь данные из монтажного стола. Пример этого в obj-c можно найти here.

person Michael    schedule 19.01.2016
comment
Это совершенно верно, это то, что я хочу сделать. Но я не могу преобразовать код Objective-C. Возможно, мне придется искать быстрый эквивалент CGEventCreateKeyboardEvent. Ему не нравится ни один из идентификаторов, указанных в этом блоке кода. - person Aaron; 19.01.2016
comment
Взгляните на stackoverflow.com/questions/27484330/ - он делает то же самое и написан на Swift (хотя для Swift 2 могут быть некоторые отличия). Подобный код также есть на github.com/pikajude/Maxxxro/blob/master. /Maxxxro/, на которые вы, возможно, захотите взглянуть. - person Michael; 19.01.2016

Догадаться!

ПРИМЕЧАНИЕ. Вы должны отложить функцию вставки. copyText() нужно время для записи в монтажный стол.

func copyText() {
    // Clear pasteboard
    pasteBoard.clearContents()

    let src = CGEventSourceCreate(CGEventSourceStateID.HIDSystemState)

    //let cmdd = CGEventCreateKeyboardEvent(src, 0x37, true)
    let cmdu = CGEventCreateKeyboardEvent(src, 0x37, false)

    let c_down = CGEventCreateKeyboardEvent(src, 0x08, true)
    let c_up = CGEventCreateKeyboardEvent(src, 0x08, false)

    // Set Flags
    CGEventSetFlags(c_down, CGEventFlags.MaskCommand)
    CGEventSetFlags(c_up, CGEventFlags.MaskCommand)

    let loc = CGEventTapLocation.CGHIDEventTap

    //CGEventPost(loc, cmdd)
    CGEventPost(loc, c_down)
    CGEventPost(loc, c_up)
    CGEventPost(loc, cmdu)
}


func paste() -> String {
    let lengthOfPasteboard = pasteBoard.pasteboardItems!.count
    print(lengthOfPasteboard)
    var theText = ""
    if lengthOfPasteboard > 0 {
      theText = pasteBoard.pasteboardItems![0].stringForType("public.utf8-plain-text")!
    } else {
      theText = "Nothing Coppied"
    }

    //print(theText)
    return theText
}

Я вызываю это из AppDelegate.swift, а не из ViewController. Так что, надеюсь, он скопирует текст до того, как мое всплывающее окно станет активным / сфокусированным окном.

person Aaron    schedule 21.01.2016