2013-02-25 96 views
6

मुझे अपनी खिड़की पर ध्यान केंद्रित किए बिना तीसरे पक्ष के अनुप्रयोगों के ऊपर एक विंडो (शीर्षक बार के बिना) दिखाने की ज़रूरत है।सक्रिय किए बिना विंडो दिखाएं (इसे नीचे सक्रिय एप्लिकेशन रखें)

मैंने NSPanel का उपयोग करने और गैर-सक्रियण सक्षम करने की सेटिंग करने का प्रयास किया है, लेकिन इससे मदद नहीं मिली।

मैंने orderFront:self की कोशिश की, लेकिन इससे कोई मदद नहीं मिली।

मुझे हमेशा [NSApp activateIgnoringOtherApps:YES]; जोड़ने की आवश्यकता है क्योंकि विंडो अन्यथा नहीं दिखाएगी।

मैं यहाँ सिर्फ इस कार्यक्षमता के लिए एक नमूना परियोजना है:
http://users.telenet.be/prullen/TopW2.zip

UIElement आवेदन के plist फ़ाइल में true के लिए निर्धारित है, इसलिए कोई गोदी है। आप एक ही समय में ALT + SPACE दबाकर विंडो को सक्रिय कर सकते हैं। आप देखेंगे कि इसके नीचे वाला ऐप फोकस खो देता है। इसे ठीक करने के तरीके पर कोई विचार? मैंने देखा है कि अन्य ऐप्स ऐसा करते हैं इसलिए मुझे पता है कि यह संभव है।

संपादित करें: यहां तक ​​कि कोड अब तक है। याद रखें कि खिड़की एक गैर-सक्रिय एनएसपीनल है। मुझे अभी भी उस अंतिम NSApp activateIgnoringOtherApps लाइन की आवश्यकता है या अन्यथा यह प्रदर्शित नहीं होता है। लेकिन निश्चित रूप से खिड़की को सक्रिय बनाता है।

_windowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"]; 

    [[_windowController window] setLevel:NSNormalWindowLevel+1]; 
    [[_windowController window] orderFrontRegardless]; 

    [_windowController showWindow:self]; 

    [NSApp activateIgnoringOtherApps:YES]; 

मैं भी NSPanel subclassed है और दो तरीकों कहा:

- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 

- (BOOL)canBecomeMainWindow 
{ 
    return YES; 
} 

संपादित करें: ठीक है, setHidesOnDeactivate फिक्स इस अनचेक, लेकिन अब खिड़की छिपाने कभी नहीं होगा। जब मुझे उपयोगकर्ता नीचे ऐप दबाता है या किसी अन्य ऐप पर स्विच करता है तो मुझे इसे छिपाने की आवश्यकता होती है।

संपादित करें 2: वहाँ एक बेहतर तरीका है

- (void)awakeFromNib 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideWindow) name:NSWindowDidResignKeyNotification object:nil]; 
} 
- (void)hideWindow { 
    [self setHidesOnDeactivate:YES]; 
} 

सुनिश्चित नहीं हैं: ठीक है, यह ऊपर इस मुद्दे को ठीक करने लगता है।

और उन है कि कैसे विंडो प्रदर्शित करने के लिए जानना चाहता हूँ:

[[_windowController window] setLevel:NSPopUpMenuWindowLevel]; 
    [[_windowController window] orderFrontRegardless]; 
    [[_windowController window] makeKeyWindow]; 

    [_windowController showWindow:self]; 

उत्तर

3

या तो इनमें से किसी एक चाल करना चाहिए:

  • उपयोग -[NSWindow orderFrontRegardless] सामने से एक सामान्य स्तर खिड़की पाने के लिए संबंधित ऐप को सक्रिय किए बिना, या
  • -[NSWindow setLevel:] का उपयोग करें NSNormalWindowLevel
  • से अधिक कुछ विंडो विंडो स्तर को बढ़ाने के लिए
+0

धन्यवाद करने के लिए बदलने के लिए, दुर्भाग्य से यह अभी भी काम नहीं करता। मुझे अभी भी सक्रिय IgnoringOtherApps जोड़ने की आवश्यकता है: सत्य कॉल, अन्यथा यह नहीं दिखाता है। और निश्चित रूप से यह कॉल सक्रिय विंडो बनाता है। – Wesley

+2

@Wesley अनचेक अपने एनआईबी में पैनल के लिए "निष्क्रिय पर छिपाएं" अनचेक करें। – puzzle

+2

धन्यवाद, मैंने इसके बारे में क्यों नहीं सोचा? ऑर्डरफ्रंट रेगेर्डलेस और सेटलेवल के साथ यह विकल्प, अंत में काम करता है। धन्यवाद! – Wesley

1

@ पहेली के उपयोगी उत्तर से दूर नहीं जाना चाहिए, लेकिन ऐसा लगता है कि NSWindow के बजाय NSPanel का उपयोग करने से आपकी समस्या का कुछ संबंध है।

"फलक कैसे कार्य करते" डॉक्स कहते हैं:

  • परदे पर पैनल, चेतावनी संवाद के अलावा, स्क्रीन से हटा दिया जाता है जब आवेदन सक्रिय नहीं है और बहाल कर रहे हैं जब आवेदन फिर से सक्रिय हो जाता है । यह स्क्रीन अव्यवस्था को कम कर देता है।
  • विशेष रूप से, छुपाओं के एनएसविंडो कार्यान्वयनऑनडिक्टिवेट विधि को वापस नहीं करता है, लेकिन उसी विधि के एनएसपीनल कार्यान्वयन को YES देता है।

तो शायद आप hidesOnDeactivate रद्द कर सकते थे नहीं लौटने के लिए, या NSWindow

+0

मुझे लगता है कि समस्या एनआईबी में है, hideOnDeactivate वहां चेक किया गया है। – puzzle

+0

मैंने निष्क्रिय करने पर अनचेक छुपाया है, लेकिन अब पैनल कभी छुपा नहीं है। जब मैं नीचे दिए गए ऐप पर क्लिक नहीं करता, तब नहीं जब मैं किसी अन्य ऐप पर स्विच करता हूं। कोई विचार? – Wesley