2012-09-23 17 views
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 

그리고이 모든 잘 작동합니다. 오버레이가 만들어지고 키보드 이벤트를 캡처 할 수 있습니다. 그러나 오버레이를 시작했을 때 내 앱에 초점이 맞춰 졌음에도 불구하고 먼저 오버레이를 클릭하여 포커스를 주거나 활성으로 만들어야합니다. 오버레이를 만드는 방법에 대한 아이디어가 있으므로 키보드 이벤트가 오버레이를 먼저 클릭하지 않아도 작동 할 수 있도록 초점이 맞춰질 것입니다.

답변

0

OverlayWindow 클래스가 NSWindow에서 상속 된 것처럼 보입니다.
makeKeyAndOrderFront: 메서드를 사용할 수 있습니다.

실제로는 orderFrontRegardless을 사용하고 있습니다. 창을 효과적으로 앞쪽으로 옮길 수는 있지만 창이되지는 않습니다.

그래서 대체 :

[ self.overlay orderFrontRegardless ]; 

기준 :

[ self.overlay makeKeyAndOrderFront: nil ]; 
+0

그게 전부를, 감사합니다! 나는 가까웠다. 나는 시도했다 : [self.overlay makeKeyAndOrderFront : self]; 그러나 그것은 작동하지 않았다. 정말 고마워 :) – socketwiz

관련 문제