ページ

2009年6月18日木曜日

ホットキー変更対応(7) - キーを表示する(その2)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前回紹介した方法では入力キーを表現する為に 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キーなど特殊なキーの場合は特別文字が割り当てられないようだ。