OS X でポップオーバー メニュー バー アプリを作成しています。
目標は、現在アクティブなアプリケーション (ポップオーバーではない) の選択されたテキストをアプリにコピーして、文字列として使用できるようにすることです。
OS X でポップオーバー メニュー バー アプリを作成しています。
目標は、現在アクティブなアプリケーション (ポップオーバーではない) の選択されたテキストをアプリにコピーして、文字列として使用できるようにすることです。
NSPasteboard クラスは、ペーストボードに情報を配置/取得するために使用されます。私が理解しているように、別のアプリケーションで現在選択されているテキストをアプリケーションの文字列に取得したいと考えています。これを実現するアクセシビリティ API。
キーを別のアプリケーションに送信できるので、Cmd-C を別のアプリケーションに送信し、ペーストボードからデータを取得できます。obj-c でのこの例を見つけることができますhere
。
理解した!
注: 貼り付け機能を遅らせる必要があります。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
}
ViewController ではなく、AppDelegate.swift から呼び出しています。私のポップオーバーがアクティブ/フォーカスされたウィンドウになる前にテキストをコピーすることを願っています。