Я ищу способ имитации нажатий клавиш в OSX. Я нашел другое решение (Simulate keypress for system wide hotkeys) с помощью Objective-C, но мне нужно сделать это с помощью Swift. Как я могу адаптировать CGEventCreateKeyboardEvent?Имитировать нажатие клавиши с помощью Swift
ответ
код на этом связанный ответ довольно легко конвертируются в Swift код, однако есть несколько подводных камней вам нужно будет заботиться о по пути:
CGEventSourceCreate
принимает CGEventSourceStateID
, который является typealiase для a UInt32
, но константы, такие как kCGEventSourceStateHIDSystemState
, определены как Int
, поэтому вам нужно будет их отличить, т.е. CGEventSourceStateID(kCGEventSourceStateHIDSystemState)
. Аналогично с CGEventFlags
.
CGEventSourceCreate
и CGEventCreateKeyboardEvent
возвращение Unmanaged<CGEventSource>
(или Unmanaged<CGEvent>
). Автоматически созданный Swift API для Core Graphics не знает, нужно ли вам возвращать возвращаемые объекты или нет, поэтому вам нужно проверить документы API для этих вызовов, а затем использовать takeRetainedValue()
или takeUnretainedValue()
соответственно по возвращаемому значению, чтобы преобразовать их в базовый тип, с которым вы хотите работать.
Наконец, они возвращают неявно развернутые опции, поэтому вам нужно будет решить, хотите ли вы проверить наличие нил или просто жить с волнением взрывов во время работы, если они когда-либо вернут его.
Учитывая все, что это довольно просто превратить Objective-C в этом ответе, демонстрирующего нажав Cmd-Space Свифта, я просто попытался склеивание это в царапанию приложение и оно работало отлично:
(хотя я гавань» т проверили API Документы для того, сохраняют правильное, что нужно сделать или нет)
let src = CGEventSourceCreate(CGEventSourceStateID(kCGEventSourceStateHIDSystemState)).takeRetainedValue()
let cmdd = CGEventCreateKeyboardEvent(src, 0x38, true).takeRetainedValue()
let cmdu = CGEventCreateKeyboardEvent(src, 0x38, false).takeRetainedValue()
let spcd = CGEventCreateKeyboardEvent(src, 0x31, true).takeRetainedValue()
let spcu = CGEventCreateKeyboardEvent(src, 0x31, false).takeRetainedValue()
CGEventSetFlags(spcd, CGEventFlags(kCGEventFlagMaskCommand));
CGEventSetFlags(spcd, CGEventFlags(kCGEventFlagMaskCommand));
let loc = CGEventTapLocation(kCGHIDEventTap)
CGEventPost(loc, cmdd)
CGEventPost(loc, spcd)
CGEventPost(loc, spcu)
CGEventPost(loc, cmdu)
Работа с Swift 3
let src = CGEventSource(stateID: CGEventSourceStateID.hidSystemState)
let cmdd = CGEvent(keyboardEventSource: src, virtualKey: 0x38, keyDown: true)
let cmdu = CGEvent(keyboardEventSource: src, virtualKey: 0x38, keyDown: false)
let spcd = CGEvent(keyboardEventSource: src, virtualKey: 0x31, keyDown: true)
let spcu = CGEvent(keyboardEventSource: src, virtualKey: 0x31, keyDown: false)
spcd?.flags = CGEventFlags.maskCommand;
let loc = CGEventTapLocation.cghidEventTap
cmdd?.post(tap: loc)
spcd?.post(tap: loc)
spcu?.post(tap: loc)
cmdu?.post(tap: loc)
Swift 3
Для меня значения шестнадцатеричного ключа, такие как: 0x124, не работали, но простой UInt 124 сделал трюк!
Приятная коллекция ключей может быть found here! Этот фрагмент кода для копирования-вставки имитирует нажатие правой стрелки. Измените номер ключа для того, что вы хотите имитировать:
// Simulate Right Arrow keypress
let NSKeyCodeRightArrow: UInt16 = 124
let keyDownEvent = CGEvent(keyboardEventSource: nil, virtualKey: NSKeyCodeRightArrow, keyDown: true)
keyDownEvent?.flags = CGEventFlags.maskCommand
keyDownEvent?.post(tap: CGEventTapLocation.cghidEventTap)
let keyUpEvent = CGEvent(keyboardEventSource: nil, virtualKey: NSKeyCodeRightArrow, keyDown: false)
keyUpEvent?.flags = CGEventFlags.maskCommand
keyUpEvent?.post(tap: CGEventTapLocation.cghidEventTap)
- 1. Имитировать нажатие клавиши вкладок с помощью jQuery
- 2. Имитировать нажатие клавиши с помощью встроенного javascript
- 3. Имитировать нажатие клавиши с помощью jQuery
- 4. Как имитировать нажатие клавиши с помощью Javascript?
- 5. имитировать нажатие клавиши на кнопке
- 6. Имитировать нажатие клавиши без jquery
- 7. Как имитировать непрерывное нажатие клавиши
- 8. Как имитировать нажатие клавиши тангажа с угловым
- 9. Как заставить AppleScript имитировать нажатие клавиши «1»?
- 10. Как имитировать нажатие клавиши на фоновом окне
- 11. Имитировать нажатие клавиши ввода в Javascript с помощью GreaseMonkey
- 12. Windows Forms: имитировать нажатие клавиши на клавиатуре
- 13. Имитировать нажатие клавиши ввода в Perl
- 14. Android ADB: имитировать последнее нажатие клавиши приложения
- 15. C#: Имитировать нажатие клавиши в игре
- 16. Имитировать нажатие клавиши «ENTER» в сценарии оболочки
- 17. Имитировать нажатие клавиши [enter] при вводе текста
- 18. Как имитировать нажатие клавиши в ExtendScript?
- 19. Имитировать нажатие клавиши в firefox addon
- 20. Как имитировать нажатие клавиши в сценарии Greasemonkey?
- 21. Сделайте программу, которая может имитировать нажатие клавиши
- 22. Как имитировать нажатие клавиши клавиатуры/мыши?
- 23. Имитировать escape-нажатие клавиши без jquery
- 24. имитировать нажатие клавиши в selenium webdriverjs
- 25. Имитация Нажатие клавиши ввода с помощью jQuery
- 26. как имитировать нажатие клавиши в Android с AccessibilityService
- 27. Android: имитировать физическое нажатие клавиши ввода с клавиатуры
- 28. Нажатие клавиши с питона WIN32API
- 29. Android имитирует нажатие клавиши
- 30. Имитировать нажатие кнопки с помощью JavaScript
большое вам спасибо! – ixany
@Airspeed: хороший ответ. Хотя мы можем сделать «значения шестнадцатеричных ключей» более понятными, например KVK_ANSI_A – Kaunteya
Больше не работает с Swift 3 :( – Nisba