2012-11-13 5 views
6

OS Xアプリケーションを作成して、システム全体のホットキーに集中してから、同じホットキーで消してからにフォーカスを戻します。。アルフレッドがやったように。Cocoaはアプリケーションにフォーカスしてスイッチバックします。

問題は以前使用していたアプリケーションに焦点を合わせることができないことです。私は以前のアプリでタイピングを続けることができないことを意味することに焦点を当てることによって。ここで

は私のホットキーハンドラです:

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; 
} 

答えて

5

だけでなく、両方のケースでアクティブに...あなたは無効はずです。あなたがアクティブにする前に、アクティブ

 _oldApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; 

以降の古いアクティブなアプリを保存すること

 [_oldApp activateWithOptions:NSApplicationActivateIgnoringOtherApps]; 

---これは動作しますが、frontmostApplicationアプリは時間であることに注意してください

@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 
+1

完全なソースapplicationWilLBecomeActive通知が到着します。最も重要なアプリケーションは、ホットキーハンドラでチェックする必要があります。 –

関連する問題