Cocoa开关专注于应用程序,然后将其切换回来

sas*_*hab 7 macos cocoa macos-carbon objective-c

我想创建OS X应用程序,它显示并聚焦系统范围的热键,然后,使用相同的热键,它应该消失并切换回焦点.就像阿尔弗雷德那样.

问题是我无法专注于以前使用过的应用程序.通过回顾我的意思是我不能继续键入以前的应用程序.

这是我的热键处理程序:

OSStatus OnHotKeyEvent(EventHandlerCallRef nextHandler,EventRef theEvent, void *userData)
{
    AppDelegate *me = (__bridge AppDelegate*) userData;

    EventHotKeyID hkCom;

    GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(hkCom), NULL, &hkCom);

    if([[me window] isVisible]) {
        [[NSApplication sharedApplication] activateIgnoringOtherApps:NO];
        [[me window] orderOut:NULL];
    }
    else {
        [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
        [[me window] makeKeyAndOrderFront:nil];

    }

    return noErr;
}
Run Code Online (Sandbox Code Playgroud)

Dai*_*jan 7

在两种情况下都很好激活...你应该停用.在激活之前,请保存旧的活动应用

        _oldApp = [[NSWorkspace sharedWorkspace] frontmostApplication];
Run Code Online (Sandbox Code Playgroud)

以后激活它

        [_oldApp activateWithOptions:NSApplicationActivateIgnoringOtherApps];
Run Code Online (Sandbox Code Playgroud)

---完整的来源

@implementation DDAppDelegate {
    NSStatusItem *_item;
    NSRunningApplication *_oldApp;
}

- (void)applicationWillFinishLaunching:(NSNotification *)notification {
    NSLog(@"%@", [[NSWorkspace sharedWorkspace] frontmostApplication].bundleIdentifier);

    _item = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
    _item.title = @"TEST";
    _item.target = self;
    _item.action = @selector(toggle:);
}

- (void)applicationWillBecomeActive:(NSNotification *)notification {
    NSLog(@"%@", [[NSWorkspace sharedWorkspace] frontmostApplication].bundleIdentifier);
}

//---

- (IBAction)toggle:(id)sender {
    if(!_oldApp) {
        NSLog(@"%@", [[NSWorkspace sharedWorkspace] frontmostApplication].bundleIdentifier);
        _oldApp = [[NSWorkspace sharedWorkspace] frontmostApplication];
        [NSApp activateIgnoringOtherApps:YES];
    }
    else {
        [_oldApp activateWithOptions:NSApplicationActivateIgnoringOtherApps];
        _oldApp = nil;
    }
}
@end
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但请注意,在 applicationWilLBecomeActive 通知到达时,最前面的应用程序是您的应用程序。必须在热键处理程序中检查最前面的应用程序。 (2认同)