1

我正在 OS X 中编写一个弹出菜单栏应用程序。

目标是将当前活动应用程序(不是我的弹出窗口)的选定文本复制到我的应用程序中,以便我可以将其用作字符串。

4

2 回答 2

2

NSPasteboard 类用于在粘贴板上放置/获取信息。据我了解,您希望将另一个应用程序中当前选择的文本转换为应用程序中的字符串。实现此目的的辅助功能 API。

您可以将密钥发送到另一个应用程序,因此您可以将 Cmd-C 发送到另一个应用程序,然后从粘贴板中提取数据。可以在 obj-c 中找到一个这样的示例here

于 2016-01-19T00:43:22.683 回答
2

弄清楚了!

注意:您必须延迟粘贴功能。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。这样它就有希望在我的弹出窗口成为活动/聚焦窗口之前复制文本。

于 2016-01-21T15:42:10.037 回答