フチなしオーバーレイを作成する次のコードがあります。
AppDelegate.m
NSRect frame = [[NSScreen mainScreen] frame];
self.overlay = [[OverlayWindow alloc] initWithContentRect:frame
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:NO];
[self.overlay setAcceptsMouseMovedEvents:YES];
[self.overlay setOpaque:NO];
[self.overlay setLevel:CGShieldingWindowLevel()];
[self.overlay setBackgroundColor:[NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.0 alpha:0.75]];
// Create the subview
OverlayView *subview = [[OverlayView alloc] initWithFrame:NSZeroRect];
[[self.overlay contentView] addSubview:subview];
[self.overlay setContentView:subview];
[self.overlay makeFirstResponder:subview];
[self.overlay orderFrontRegardless];
OverlayWindow.m
@implementation OverlayWindow
// need this so that we can accept mouse events in our view
// we want to use NSBorderlessWindowMask for this window, and that prevents us from
// becoming a key window and thus mouse events don't work
- (BOOL)canBecomeKeyWindow
{
return YES;
}
- (BOOL)canBecomeMainWindow
{
return YES;
}
@end
OverlayView.m
@implementation OverlayView
- (BOOL)acceptsFirstResponder {return YES;}
- (BOOL)resignFirstResponder {
self.needsDisplay = YES;
return YES;
}
- (BOOL)becomeFirstResponder {return YES;}
- (BOOL)canBecomeKeyWindow {return YES;}
...
- (void)keyDown:(NSEvent *)theEvent {
switch (theEvent.keyCode) {
case 53:
[[self window] close];
break;
default:
break;
}
}
@end
そして、これはすべてうまく機能します。オーバーレイが作成され、キーボードイベントをキャプチャできます。ただし、オーバーレイを起動したときにアプリにフォーカスがあったとしても、最初にオーバーレイをクリックしてフォーカスを与えるか、アクティブにする必要があります。最初にオーバーレイをクリックしなくてもキーボードイベントが機能するように、フォーカスが合うようにオーバーレイを作成する方法はありますか?