目标C中是否有丢失的焦点窗口事件?

时间:2015-04-21 18:07:42

标签: objective-c cocoa

来自.NET背景我已经习惯了被解雇的事件,因此捕获丢失的焦点事件很容易,但我不确定如何在Obj-C中执行此操作。基本上我希望我的应用程序知道另一个应用程序何时获得了关注并且它不再具有它以便它可以执行某些操作。

请告诉我如何在Obj-C中为OSX应用程序实现这种功能?

2 个答案:

答案 0 :(得分:7)

查看NSWindow通知。具体而言,您对NSWindowDidBecomeKeyNotificationNSWindowDidResignKeyNotification感兴趣。您还可以为窗口创建委托并实施其windowDidBecomeKey:windowDidResignKey:方法,如NSWindowDelegate protocol documentation中所述。

或者,如果您只想知道应用程序(非窗口)何时获得焦点,您可以订阅NSApplicationDidBecomeActiveNotification。同样,NSApplicationDidResignActiveNotification会在您的应用失去焦点时通知您。这些通知的讨论更多here。您还可以在application delegate中实施applicationWillBecomeActive:applicationWillResignActive:

答案 1 :(得分:2)

目前还不清楚您是否希望通知单个窗口失去焦点或通知整个应用程序失去焦点。我的回答提供了整个应用失去焦点的通知。 (如果您只是想知道应用程序的某个窗口何时失去焦点,请参阅mipadi的答案。)

遵守相应的通知:

[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self 
    selector:@selector(appDeactivated:) 
    name:NSWorkspaceDidDeactivateApplicationNotification 
    object:nil];

然后添加处理程序方法:

-(void) appDeactivated:(NSNotification *)notification
{
    NSRunningApplication* app = [notification.userInfo objectForKey:@"NSWorkspaceApplicationKey"];

    if (app == [NSRunningApplication currentApplication]) {

        // your cleanup code here
    }
}