前回紹介した方法では入力キーを表現する為に plistで文字を用意していた。
SimpleCapでもその方法を取ろうかと思ったが、APIぐらいあるんじゃないかとも思い調べてみた。
すると情報があった。
Cocoa-dev - virtual keycode to character
この情報によると Carbonで用意されている関数を使うと入力キーを文字表現に変換することができるらしい。
早速試してみよう。幸いソースコードもこのメーリングリストに出ている。
Re: virtual keycode to character
こんな感じになった。デバッガコンソールへ表示するようにしてある。
AppController.m
- (void)awakeFromNib
{
UInt32 key = 29; //'0'
UInt32 dead_key_state = 0;
UniCharCount count = 0;
UniChar base_char;
TISInputSourceRef source_ref = TISCopyCurrentKeyboardLayoutInputSource();
CFDataRef unicodekey_layout_ref = (CFDataRef)TISGetInputSourceProperty(source_ref, kTISPropertyUnicodeKeyLayoutData);
CFRelease(source_ref);
UCKeyTranslate((UCKeyboardLayout*)CFDataGetBytePtr(unicodekey_layout_ref),
key,
kUCKeyActionDown,
0,
LMGetKbdType(),
kUCKeyTranslateNoDeadKeysBit,
&dead_key_state,
1,
&count,
&base_char);
NSLog(@"%C", base_char);}
実行してみよう。キーコード 29 は '0'と表示されるはず。
[Session started at 2009-06-18 22:25:17 +0900.]
2009-06-18 22:25:19.105 HotkeyUI[1667:10b] 0
出た。'0'だとわかりずらいので他のコードを試してみよう。
'c' (0x08)はどうだ。
[Session started at 2009-06-18 22:27:58 +0900.]
2009-06-18 22:27:59.200 HotkeyUI[1727:10b] c
出た。
TABキー (0x30)はどうだ。
[Session started at 2009-06-18 22:31:15 +0900.]
2009-06-18 22:31:17.820 HotkeyUI[1827:10b]
出ない。
ESCキーなど特殊なキーの場合は特別文字が割り当てられないようだ。