ページ

2008年3月12日水曜日

NSBorderlessWindowMask ウィンドウでのキーイベントの受取

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

キャプチャのサンプルを作る過程でキー入力のハンドリングが必要になった。今までのサンプルではウィンドウをNIB経由ではなく実行時に動的に作っていた。このウィンドウは NSBorderlessWindowMask スタイルで作ってあるためにそのままではキーイベントが拾えない。そこでいくつかの必要な実装を加える。

まず NSWindowのサブクラスを作り canBecomeKeyWindowをオーバーライドする。

@interface MyWindow : NSWindow { }
@end
@implementation MyWindow
- (BOOL)canBecomeKeyWindow { return YES; }

@end



その上でこのサブクラスを使うようにする。
(旧)_fullscreen_window = [[NSWindow alloc] initWithContentRect:
(新)_fullscreen_window = [[MyWindow alloc] initWithContentRect: ...


最後に keyDown: を実装する。

ビューの方でハンドリングしたい場合は acceptsFirstResponder をオーバーライドし、keyDown: を実装する。
- (BOOL)acceptsFirstResponder
{
NSLog(@"acceptFirstResponder");


- (void)keyDown:(NSEvent *)theEvent
{
NSLog(@"keyDown:");
}



またウィンドウのレスポンダチェインへ追加する。
[_fullscreen_window setNextResponder:_fullscreen_view];