2014-12-15 2 views

ответ

7

код на этом связанный ответ довольно легко конвертируются в 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) 
+1

большое вам спасибо! – ixany

+0

@Airspeed: хороший ответ. Хотя мы можем сделать «значения шестнадцатеричных ключей» более понятными, например KVK_ANSI_A – Kaunteya

+0

Больше не работает с Swift 3 :( – Nisba

9

Работа с 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) 
0

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) 
Смежные вопросы