【问题标题】:Cocoa switch focus to application and then switch it back可可将焦点切换到应用程序,然后将其切换回来
【发布时间】:2012-11-02 07:01:33
【问题描述】:

我想创建一个 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;
}

【问题讨论】:

    标签: objective-c macos cocoa macos-carbon


    【解决方案1】:

    在这两种情况下都可以激活...您应该停用。在激活之前,请保存旧的活动应用

            _oldApp = [[NSWorkspace sharedWorkspace] frontmostApplication];
    

    稍后激活它

            [_oldApp activateWithOptions:NSApplicationActivateIgnoringOtherApps];
    

    --- 完整来源

    @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
    

    【讨论】:

    • 这可行,但请注意,当 applicationWilLBecomeActive 通知到达时,最前面的应用程序是您的应用程序。必须在热键处理程序中检查最前面的应用程序。
    猜你喜欢
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多