Próbuję mieć program obsługi w mojej aplikacji Mac OS X napisany w języku Swift dla globalnego (ogólnosystemowego) zestawu klawiszy skrótu, ale po prostu nie mogę znaleźć odpowiedniej dokumentacji dla niego. Czytałem, że musiałbym się z tym pogodzić w jakimś legendarnym Carbon API, czy nie ma lepszego sposobu? Czy możesz pokazać mi jakiś dowód koncepcji kodu Swift? Z góry dziękuję!Jak słuchać globalnych skrótów klawiszowych za pomocą Swift w aplikacji OS X?
Odpowiedz
Od Swift 2.0 można teraz przekazać wskaźnik funkcji do 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)
Nie działa w 'Swift 4' i bez bardziej szczegółowego wyjaśnienia nie można go zrealizować. – ixany
Działa dobrze w Swift 4, przekonwertowałem swoje projekty na Swift 4 i działa dobrze. Jako programista powinieneś wiedzieć, że "nie działa" to najgorszy możliwy opis problemu - co oznacza "nie działa"? Nie kompiluje? Jaki błąd kompilacji dostałeś? Naprawdę nie ma wiele do wyjaśnienia - każda z użytych funkcji jest udokumentowana przez Apple. –
Tylko dobre wibracje, Charlie! Byłoby wspaniale, gdybyś mógł również udostępnić swoje rozwiązanie Swift 4. Opublikowane rozwiązanie jest niekompletne, co utrudnia początkującym adaptację. Jedną rzeczą, która może być pomocna, jest to, że import "węgla" jest konieczny. Następnym problemem, z którym miałem do czynienia jest to, że 'String' nie ma właściwości' .fourCharCodeValue'. Również byłoby wspaniale, gdybyś mógł podać przykład dla 'keyCode' i' modifierKeys'. – ixany
Nie wierzę, że możesz zrobić to w 100% Swift już dziś. Będziesz musiał zadzwonić pod numer InstallEventHandler()
lub CGEventTapCreate()
, a oba te wymagają numeru CFunctionPointer
, którego nie można utworzyć w Swift. Twoim najlepszym pomysłem jest użycie sprawdzonych rozwiązań ObjC, takich jak DDHotKey i przejście do Swift.
Możesz spróbować użyć NSEvent.addGlobalMonitorForEventsMatchingMask(handler:)
, ale to tylko tworzy kopie wydarzeń. Nie możesz ich konsumować. Oznacza to, że skrót będzie również przekazywany do aktualnie aktywnej aplikacji, co może powodować problemy. Oto przykład, ale polecam podejście ObjC; prawie na pewno będzie lepiej.
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)
}
Wymaga to również zatwierdzenia usług dostępności dla tej aplikacji. Nie przechwytuje również zdarzeń, które są wysyłane do Twojej aplikacji, więc musisz je przechwycić łańcuchem odpowiadającym, naszemu użyciu addLocalMointorForEventsMatchingMask(handler:)
, aby dodać lokalny handler.
Chociaż jest to użyteczne, ważne jest, aby pamiętać, że użytkownik przyznaje Twojej aplikacji możliwość monitorowania każdego pojedynczego uderzenia klucza, co jest potencjalnie niebezpieczne, zwłaszcza, jeśli twoja aplikacja nie jest piaskownica i może zostać wstrzyknięta . Stary Carbon API zrobi to tylko dla kombinacji zdefiniowanych przez użytkownika, czyniąc je "bezpieczniejszym" rozwiązaniem. –
Szybkie Swift 3 aktualizacja dla konfiguracji:
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)
Uwaga: Oparty na węglu interfejs API klawiszy skrótu nie wymaga uprawnień dostępu (nie może być w sklepie Mac App Store), chociaż jest to z pewnością łatwiejsze do wdrożenia. – ctietze
Istnieją aplikacje takie jak CopyLess 2, które nasłuchują na keyDown i nie wymagają dostępu, czy wiesz coś o nich? Może aplikacje ze sklepu nie wymagają tego? –
Spójrz w Bibliotece skrótu klawiaturowego. Możesz po prostu użyć Kartaginy, aby zaimplementować ją w swojej własnej aplikacji. HotKey Library
- 1. Tworzenie skrótów klawiszowych dla aplikacji HTML5?
- 2. Aplikacja na iPhone'a/iPada za pomocą skrótów klawiszowych?
- 3. Wyłączanie skrótów klawiszowych IE w kontrolkach WebBrowser
- 4. Uzyskiwanie ról użytkownika w aplikacji serwletu za pomocą placków klawiszowych
- 5. Czy istnieje encyklopedia emacsa skrótów klawiszowych?
- 6. pathForResource zwraca zero w aplikacji konsoli Mac OS X - Swift
- 7. Zakładki w Eclipse, ustawione i używane za pomocą skrótów klawiszowych, czy istnieją?
- 8. Jak słuchać portu TCP za pomocą PHP?
- 9. Jak uruchomić JavaScript za pomocą jsc na OS X?
- 10. Jak rozpowszechniać system Mac OS X za pomocą bibliotek zależnych?
- 11. Aktualizacje aplikacji w systemie Mac OS X
- 12. os x Swift: pobierz ścieżkę pliku za pomocą przeciągania i upuszczania
- 13. Zmień tytuł aplikacji Tkinter w pasku menu OS X
- 14. Jak ustawić ikonę dla aplikacji aplikacji Mac OS X?
- 15. Jak utworzyć aplikację wielostronicową, używając Swift dla OS X?
- 16. Manipulowanie oknami systemu OS X za pomocą skryptu
- 17. przenoszenie aplikacji openGLES na OS X?
- 18. Wyliczanie wszystkich zainstalowanych aplikacji na OS X
- 19. Nieprawidłowe kolory wygładzania za pomocą Pygame na OS X
- 20. Zdalne debugowanie XCode aplikacji OS X
- 21. Jak hakować słownik OS X
- 22. . Aplikacja .NET do aplikacji Mac OS X?
- 23. Odinstalowywanie pakietów w systemie Mac OS X
- 24. globalne klawisze skrótów w języku Java
- 25. OS X dzyń -pthread
- 26. Jak słuchać zmian adresu URL za pomocą rozszerzenia Chrome
- 27. assembler w os x
- 28. Jak przekazywać dane za pomocą NotificationCentre w swift 3.0 i NSNotificationCenter w swift 2.0?
- 29. Jak zaimplementować klawisze skrótów podobne do Gmaila
- 30. Uruchamiaj aplikację Swift Cocoa przy starcie na OS X 10.11
Co dokładnie wypróbowałeś? Co masz na myśli przez klawisze skrótów? Czy wypróbowałeś globalny monitor NSEvent lub CGEventTap – uchuugaka