2012-11-13 20 views
6

पर स्विच करें, मैं ओएस एक्स एप्लिकेशन बनाना चाहता हूं जो सिस्टम-व्यापी हॉटकी के साथ दिखाई देता है और ध्यान केंद्रित कर रहा है, और उसके बाद, उसी हॉटकी के साथ इसे गायब होना चाहिए और स्विच फ़ोकस पर स्विच करना चाहिए। अल्फ्रेड की तरह ही यह करता है।कोको स्विच एप्लिकेशन पर फ़ोकस करें और फिर इसे

समस्या यह है कि मैं पहले इस्तेमाल किए गए एप्लिकेशन पर वापस ध्यान केंद्रित नहीं कर सकता। वापस ध्यान केंद्रित करके मेरा मतलब है कि मैं पिछले ऐप में टाइपिंग जारी नहीं रख सकता।

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

--- पूर्ण स्रोत

@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

यह काम करता है, लेकिन ध्यान दें कि frontmostApplication समय के द्वारा अपने ऐप है एप्लिकेशन WilLBecomeActive अधिसूचना आता है। हॉटकी हैंडलर में सबसे आगे आवेदन की जांच की जानी चाहिए। –

संबंधित मुद्दे