2012-02-16 16 views
6

Mac OS/Cocoa'da, klavye girişlerini sentezleyebilirim - dizeler - en ön uygulama için şeffaf bir şekilde mi?En öndeki uygulama için klavye olayları oluşturma

Daha kesin olması için özel karakterler veya kontrol sıraları göndermek istemiyorum. Tek ihtiyacım standart karakterleri göndermektir.

tell application "TextEdit" 
    activate 

    tell application "System Events" 
     keystroke "f" using {command down} 
    end tell 
end tell 

Q:

Sadece AppleScript böyle hile yapabileceği, here öğrenilen Nasıl bu kullanarak objc/kakao yapardınız?

GÜNCELLEME 2012-02-18 - aşağıda Nick 'ın kod dayanarak

, burada nihai çözüm geliştirilmiş Nicks önerisi:

// First, get the PSN of the currently front app 
ProcessSerialNumber psn; 
GetFrontProcess(&psn); 

// make some key events 
CGEventRef keyup, keydown; 
keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, true); 
keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, false); 

// forward them to the frontmost app 
CGEventPostToPSN (&psn, keydown); 
CGEventPostToPSN (&psn, keyup); 

// and finally behave friendly 
CFRelease(keydown); 
CFRelease(keyup); 

Bu yöntemi kullanarak, bir bir tık Etkin olmayan bir panelin düğmesi, olayı gerçek ön uygulamaya hedefler. Tam olarak ne yapmak istiyorum.

cevap

10

Tabii, daha sonra bunları özel olarak yazılan, klavye olayları oluşturmak için CGEventCreateKeyboardEvent kullanmak isteyeceksiniz:

CGEventRef keyup, keydown; 
    keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)56, true); 
    keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)56, false); 

    CGEventPost(kCGHIDEventTap, keydown); 
    CGEventPost(kCGHIDEventTap, keyup); 
    CFRelease(keydown); 
    CFRelease(keyup); 

Biraz daha karmaşık AppleScript daha var ama hile yok. do'un bir keydown ve ardından bir keyup olayı açıkça göndermeniz gerekir. Daha fazla bilgi için Quartz Event Services Reference.

+0

Teşekkür ederiz! Böyle düşük bir seviyede hiçbir şey yapmadım. – SteAp

İlgili konular