1

フチなしオーバーレイを作成する次のコードがあります。

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

そして、これはすべてうまく機能します。オーバーレイが作成され、キーボードイベントをキャプチャできます。ただし、オーバーレイを起動したときにアプリにフォーカスがあったとしても、最初にオーバーレイをクリックしてフォーカスを与えるか、アクティブにする必要があります。最初にオーバーレイをクリックしなくてもキーボードイベントが機能するように、フォーカスが合うようにオーバーレイを作成する方法はありますか?

4

1 に答える 1

0

OverlayWindowクラスはから継承しているようNSWindowです。
したがって、このメソッドを使用できますmakeKeyAndOrderFront:

実際には、を使用してorderFrontRegardlessいます。ウィンドウを効果的に前面に移動しますが、キーウィンドウにはなりません。

したがって、置き換えます:

[ self.overlay orderFrontRegardless ];

に:

[ self.overlay makeKeyAndOrderFront: nil ];
于 2012-09-23T22:12:54.193 に答える