Sto provando ad avere un gestore nella mia app per Mac OS X scritto in Swift per un combo globale (a livello di sistema), ma non riesco a trovare la documentazione adeguata per questo. Ho letto che avrei dovuto gironzolare con le vecchie API Carbon per questo, non c'è modo migliore? Puoi mostrarmi qualche prova del codice Swift? Grazie in anticipo!Come ascoltare i tasti di scelta rapida globali con Swift in un'app di OS X?
risposta
Da Swift 2.0, è ora possibile passare un puntatore di funzione alle API C.
var gMyHotKeyID = EventHotKeyID()
gMyHotKeyID.signature = OSType("swat".fourCharCodeValue)
gMyHotKeyID.id = UInt32(keyCode)
var eventType = EventTypeSpec()
eventType.eventClass = OSType(kEventClassKeyboard)
eventType.eventKind = OSType(kEventHotKeyPressed)
// Install handler.
InstallEventHandler(GetApplicationEventTarget(), {(nextHanlder, theEvent, userData) -> OSStatus in
var hkCom = EventHotKeyID()
GetEventParameter(theEvent, EventParamName(kEventParamDirectObject), EventParamType(typeEventHotKeyID), nil, sizeof(EventHotKeyID), nil, &hkCom)
/// Check that hkCom in indeed your hotkey ID and handle it.
}, 1, &eventType, nil, nil)
// Register hotkey.
let status = RegisterEventHotKey(UInt32(keyCode), UInt32(modifierKeys), gMyHotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef)
Non funziona in 'Swift 4' e senza una spiegazione più dettagliata è impossibile da implementare. – ixany
Funziona bene in Swift 4, ho convertito i miei progetti in Swift 4 e funziona perfettamente. Come sviluppatore, dovresti sapere che "non funziona" è la peggiore descrizione possibile di un problema - che cosa significa "non funziona"? Non viene compilato? Che errore di compilazione stai ottenendo? Non c'è davvero molto da spiegare - ogni funzione utilizzata è documentata da Apple. –
Solo buone vibrazioni, Charlie! Sarebbe bello poter condividere anche la tua soluzione Swift 4. La soluzione che hai postato è incompleta e ciò rende difficile adattarsi ai principianti. Una cosa che sarebbe utile dire è che è necessario importare 'Carbon'. Il prossimo problema che ho affrontato è che 'String' non ha una proprietà' .fourCharCodeValue'. Sarebbe anche bello poter fornire un esempio per 'keyCode' e' modifierKeys'. – ixany
Non credo che tu possa farlo al 100% Swift oggi. Avrai bisogno di chiamare InstallEventHandler()
o CGEventTapCreate()
, ed entrambi richiedono uno CFunctionPointer
, che non può essere creato in Swift. Il tuo piano migliore è quello di utilizzare soluzioni ObjC consolidate come DDHotKey e bridge to Swift.
Si può provare a utilizzare NSEvent.addGlobalMonitorForEventsMatchingMask(handler:)
, ma solo le copie degli eventi. Non puoi consumarli. Ciò significa che il tasto di scelta rapida verrà inoltrato anche all'app attualmente attiva, che può causare problemi. Ecco un esempio, ma raccomando l'approccio ObjC; quasi certamente funzionerà meglio.
let keycode = UInt16(kVK_ANSI_X)
let keymask: NSEventModifierFlags = .CommandKeyMask | .AlternateKeyMask | .ControlKeyMask
func handler(event: NSEvent!) {
if event.keyCode == self.keycode &&
event.modifierFlags & self.keymask == self.keymask {
println("PRESSED")
}
}
// ... to set it up ...
let options = NSDictionary(object: kCFBooleanTrue, forKey: kAXTrustedCheckOptionPrompt.takeUnretainedValue() as NSString) as CFDictionaryRef
let trusted = AXIsProcessTrustedWithOptions(options)
if (trusted) {
NSEvent.addGlobalMonitorForEventsMatchingMask(.KeyDownMask, handler: self.handler)
}
Ciò richiede anche che i servizi di accessibilità siano approvati per questa app. Inoltre, non cattura gli eventi inviati alla propria applicazione, quindi è necessario catturarli con la catena di risposta, il nostro uso è addLocalMointorForEventsMatchingMask(handler:)
per aggiungere un gestore locale.
Anche se è utilizzabile, è importante ricordare che l'utente sta concedendo alla tua app la possibilità di monitorare ogni singolo tratto chiave, che è potenzialmente pericoloso, soprattutto se l'app non è sandbox e può essere iniettata . La vecchia API Carbon farà ciò solo per le combinazioni definite dall'utente, rendendole una soluzione "più sicura". –
Un rapido Swift 3 aggiornamento per la messa a punto:
let opts = NSDictionary(object: kCFBooleanTrue, forKey: kAXTrustedCheckOptionPrompt.takeUnretainedValue() as NSString) as CFDictionary
guard AXIsProcessTrustedWithOptions(opts) == true else { return }
NSEvent.addGlobalMonitorForEvents(matching: .keyDown, handler: self.handler)
Nota: l'API Hotkey basata su carbone non ha bisogno di privilegi di accesso (non può essere sul Mac App Store), anche se questo è sicuramente più semplice da implementare. – ctietze
Ci sono app come CopyLess 2 che ascoltano keyDown e non richiedono accessibilità, ne sai qualcosa? Forse le app del negozio non lo richiedono? –
Date un'occhiata alla Biblioteca tasto di scelta rapida. Puoi semplicemente usare Carthage per implementarlo nella tua app. HotKey Library
- 1. tasti di scelta rapida globali in Java
- 2. Tasti di scelta rapida globali in un'applicazione Qt multipiattaforma
- 3. onKeyDown in un servizio? (Tasti di scelta rapida globali)
- 4. Tasti di scelta rapida per MAC OS X con applicazioni Java sfocate ... è possibile?
- 5. Tasti di scelta rapida in iOS?
- 6. Tasti di scelta rapida in WPF
- 7. I tasti di scelta rapida Eclipse non funzionano in XFCE
- 8. Come implementare i tasti di scelta rapida simili a Gmail
- 9. Come personalizzare i tasti di scelta rapida FoxitReader
- 10. Tasti di scelta rapida per suggerimenti
- 11. Tasti di scelta rapida nelle applicazioni web
- 12. Tasti di scelta rapida per comandi git
- 13. Tasti di scelta rapida per iPhone/iPad?
- 14. Tasti di scelta rapida nell'applicazione Web
- 15. Disabilita i tasti di scelta rapida IE nei controlli WebBrowser
- 16. Tasti di scelta rapida per blocchi di commento/* ... */in Xcode
- 17. Tasti di scelta rapida globali in WPF che funzionano da ogni finestra
- 18. Deinizzazione rapida di Globali
- 19. Tasti di scelta rapida del livello applicazione in WPF
- 20. Come disabilitare i tasti di scelta rapida di Facebook con l'estensione Chrome?
- 21. Tasti di scelta rapida in Microsoft Lync 2016
- 22. Tasti di scelta rapida non funzionanti in Visual Studio 2012
- 23. Tasti di scelta rapida per posizionare tasktags in Eclipse
- 24. Cambia tasti di scelta rapida in RAD Studio 2010
- 25. Tasti di scelta rapida del tasto di ricerca
- 26. Storyboard Zoom In/Out Tasti di scelta rapida
- 27. tasti di scelta rapida di Internet Explorer Disabilita
- 28. Come modificare i tasti di completamento automatico di scelta rapida Ctrl + Spazio in Eclipse per Android
- 29. Tasti di scelta rapida di Visual Studio 2010
- 30. XCode Cronologia (indietro/avanti) Tasti di scelta rapida?
Che cosa hai provato esattamente? Cosa intendi con i tasti di scelta rapida? Hai provato il monitor globale NSEvent o CGEventTap – uchuugaka