2016-01-24 4 views
1

Мне нужно смоделировать непрерывное нажатие клавиши. Например, удерживайте клавишу «c» в течение 5 секунд. Для имитации нажатия клавиш события, когда я пытался использовать CGEventCreateKeyboardEvent:Как имитировать непрерывное нажатие клавиши

let event:CGEventRef! = CGEventCreateKeyboardEvent(nil, 8, true) 
CGEventPost(CGEventTapLocation.CGSessionEventTap, event) 

Но он действует, как если кнопка сливают, а затем немедленно освобожден. Мне нужно создать событие, удерживающее кнопку (нажатие клавиши), а затем отпустить ее (клавиша вверх).

+0

Я не уверен, что понимаю, что вы пытаетесь сделать здесь. Вы имеете в виду, что реакция кнопки должна быть отложена на 5 секунд и только срабатывает, если использование снова нажимает кнопку в течение 5 секунд? Визуально также нужно это отразить? Или, возможно, вам нужно проехать в течение 5 секунд назад и сделать кнопку нажатой в течение последних Х секунд, если пользователь снова нажмет ее в течение 5 секунд в будущем. (где Doc Brown, когда он вам нужен?) –

+0

Я имею в виду, что когда пользователь нажимает конкретный ключ, система должна имитировать непрерывное нажатие. Например, я нажимаю «A» и немедленно отключаю его, но система действует так, как будто я держу клавишу «A», пока не нажму ее снова. –

ответ

3

Я не уверен, чего вы пытаетесь достичь, но, похоже, система продолжит удерживать кнопку нажатой. Этот простой эксперимент показывает это.

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    print("waiting 4 seconds, use this time to position your cursor in a text field") 
    let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(4 * Double(NSEC_PER_SEC))) 
    dispatch_after(delayTime, dispatch_get_main_queue(), { 
     self.insertLetterZ() 
    }) 
} 

func insertLetterZ() { 
    print("pressing shift") 
    self.tapButton(56) 

    print("holding button for 2 seconds") 
    let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))) 
    dispatch_after(delayTime, dispatch_get_main_queue(), { 
     print("tapping z, but Z will be selected (since shift is still being pressed)") 
     self.tapButton(6) 

     print("untapping z and shift") 
     self.untapButton(6) 
     self.untapButton(56) 
    }) 
} 

func tapButton(button: CGKeyCode) { 
    let event = CGEventCreateKeyboardEvent(nil, button, true) 
    CGEventPost(CGEventTapLocation.CGSessionEventTap, event) 
} 

func untapButton(button: CGKeyCode) { 
    let event = CGEventCreateKeyboardEvent(nil, button, false) 
    CGEventPost(CGEventTapLocation.CGSessionEventTap, event) 
} 

Этот код однако делает не прописной буквы, если пользователь вводит на клавиатуре, когда сдвиг программно нажата. Я также заметил, что если местоположение курсора будет изменено между сдвигом и z, то будет добавлено «z» вместо «Z»