2010-03-04 56 views
13

我正在寫一個應用程序,我需要在Mac上模擬按鍵事件,給定代表每個鍵的代碼。看來我需要使用CGEventCreateKeyboardEvent函數來創建事件。問題是這個函數需要一個Mac鍵碼,我擁有的是代表特定鍵的代碼。因此,例如,我收到:模擬Mac OS X中的按鍵事件

KEY_CODE_SHIFTKEY_CODE_A - 這些都是在某處定義的數字常量。

我需要把這些常量,並將它們變成CGKeyCode值。

我目前的嘗試使用類似於this SO question的代碼。問題是它只適用於可打印的字符。如果一切都失敗了,我不會在編碼轉換的硬編碼之上,但這意味着我需要一個可能的CGKeyCode值的表格,這是我還沒有找到的。

任何想法?

回答

24

這裏的代碼來模擬Cmd的 - 小號行動:

CGKeyCode inputKeyCode = kVK_ANSI_S; 
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); 
CGEventRef saveCommandDown = CGEventCreateKeyboardEvent(source, inputKeyCode, YES); 
CGEventSetFlags(saveCommandDown, kCGEventFlagMaskCommand); 
CGEventRef saveCommandUp = CGEventCreateKeyboardEvent(source, inputKeyCode, NO); 

CGEventPost(kCGAnnotatedSessionEventTap, saveCommandDown); 
CGEventPost(kCGAnnotatedSessionEventTap, saveCommandUp); 

CFRelease(saveCommandUp); 
CFRelease(saveCommandDown); 
CFRelease(source); 

一個CGKeyCode比一個無符號整數而已:

typedef uint16_t CGKeyCode; //From CGRemoteOperation.h 

你真正的問題將目光轉向一個字符(可能是NSString)轉換爲鍵碼。幸運的是,Shortcut Recorder項目的代碼只能在SRKeyCodeTransformer.m文件中執行。將字符串轉換爲鍵碼並再次返回非常棒。

+0

那麼在這個例子中,'1'的'CGKeyCode'就是S的代碼。另外,這隻適用於前臺應用程序,還是在後臺運行?是否可以在整個會話中使用?謝謝 – joec 2010-07-08 17:30:07

+0

@joec是所有這些。 – 2010-07-08 19:12:22

+0

因此,說我的應用程序在後臺運行(就像服務),我在前面有Photoshop,我可以模擬一個按鍵,它會在Photoshop中看到?謝謝 – joec 2010-07-08 20:10:08

2

萬一一些人們需要一種夫特版本:

的XCode 7.3和2.2斯威夫特:上述

let event1 = CGEventCreateKeyboardEvent(nil, 0x09, true); // cmd-v down 
CGEventSetFlags(event1, CGEventFlags.MaskCommand); 
CGEventPost(CGEventTapLocation.CGHIDEventTap, event1); 

let event2 = CGEventCreateKeyboardEvent(nil, 0x09, false); // cmd-v up 
CGEventSetFlags(event2, CGEventFlags.MaskCommand); 
CGEventPost(CGEventTapLocation.CGHIDEventTap, event2); 

代碼模擬然後CMD-V壓制釋放(又名:膏)。