2011-02-02 14 views
5

पर भेजता है तो हां, मैं अपनी खिड़की को सामने की ओर मजबूर करने के लिए SwitchToThisWindow कॉल को लागू करने की संदिग्ध स्थिति में खुद को ढूंढता हूं। मैं मानता हूं, यह आदर्श नहीं है, लेकिन उत्पाद "सुविधाओं" के खिलाफ बहस करना हमेशा संभव नहीं होता है जिसे दूसरों को आवश्यक समझा जाता है।SwitchToThisWindow पिछली विंडो को वापस

अब, मैं विचार SwitchToThisWindow इसकी कम गतिरोध की संभावना के रूप में एक मजबूर खिड़की स्विच करने के लिए AttachThreadInput हैक पर जीत है, और SwitchToThisWindow हटा दिया जाना चाहिए, या कार्य करने के लिए मैं शिकायत नहीं होगा बंद कर दें।

हालांकि, SwitchToThisWindow पर ज़ेड-ऑर्डर के नीचे वर्तमान अग्रभूमि विंडो को धक्का देने का दुर्भाग्यपूर्ण साइड इफेक्ट है, इसके अलावा लक्ष्य विंडो को FAltTab पैरामीटर के लिए पास किया गया है, और कुछ भी नहीं कर रहा है, सत्य पारित किया गया है।

AttachThreadInput का उपयोग किये बिना मैं इस 'ज़ेड-डाउन' सक्रिय सक्रिय को कैसे रोक सकता हूं?

वैकल्पिक रूप से, एमएस सिर्फ AttachThreadInput एक व्यवहार्य समाधान के रूप में निकाल सकते हैं और मैं सिर्फ अपनी प्रबंधक बता सकता है कि असंभव, वास्तव में, वास्तव में, असंभव है।

+0

मुझे लगता है कि आप बस ['SetForegroundWindow'] (http://msdn.microsoft.com/en-us/library/ms633539.aspx) का उपयोग नहीं कर सकते हैं? खिड़की को सामने लाने के अलावा, यह स्पष्ट नहीं है कि आपको किस उत्पाद सुविधा को लागू करने की आवश्यकता है। 'SetForegroundWindow' उन विंडोज़ के लिए भी काम करता है जो आपके द्वारा वर्तमान में मौजूद किसी अन्य थ्रेड से जुड़े हुए हैं, लेकिन इसके लिए आपके एप्लिकेशन को वर्तमान में अग्रभूमि में होना आवश्यक है। मैं यह नहीं बता सकता कि यह एक समस्या है या नहीं। –

+0

यह समस्या है: उपयोगकर्ता के पास एक अलग ऐप सक्रिय होने पर भी अग्रभूमि पर आ रहा है। –

+1

मैं देखता हूं। आप * उन * ऐप्स में से एक बनना चाहते हैं। कोई आश्चर्य नहीं कि आप अपनी स्थिति का वर्णन "आदर्श नहीं" के रूप में करते हैं। क्या चीजों को "सही" तरीके से करने और अधिसूचना आइकन या टोस्ट स्लाइडर दिखाने के लिए कोई विग्गल रूम नहीं है? अपने मालिक को दिखाएं: "[अच्छी तरह से डिज़ाइन किए गए कार्यक्रम अधिसूचना क्षेत्र का उपयोग उचित रूप से परेशान या विचलित किए बिना करते हैं।] (Http://msdn.microsoft.com/en-us/library/aa511448.aspx)" :-) –

उत्तर

5

अगर यह मदद करता है मैं नहीं जानता, लेकिन एक ही रास्ता मैं पता चला मज़बूती से शीर्ष पर अपनी खिड़की लाने के लिए निम्नलिखित 2 कॉल करने के लिए है:

ShowWindow(myhwnd, SW_MINIMIZE); 
ShowWindow(myhwnd, SW_RESTORE); 

जाहिर है इन कॉल केवल किया जाना चाहिए, जब झटके से बचने के लिए वर्तमान में आपकी खिड़की सबसे ऊपर नहीं है। लेकिन यह भी वर्तमान फ्रंट विंडो को जेड ऑर्डर के नीचे लाने का साइड इफेक्ट नहीं होना चाहिए।

+0

थोड़ा हैशिश महसूस करता है, लेकिन मुझे लगता है कि यह सिर्फ काम कर सकता है ... –

+0

तथ्य यह है कि यह काम करता है एक प्रमुख विंडोज़ बग अच्छा लगता है! – Anders

2

fAltTab=FALSE पारित करते समय आप वास्तव में Alt + Esc अनुकरण कर रहे हैं। तो SwitchToThisWindow कॉल के बाद SetWindowPos और hWndInsertAfter के साथ आप इस z-order परिवर्तन को उलट सकते हैं, लेकिन फिर आप बदसूरत हैकी-भूमि IMHO में वापस आ गए हैं।

सवाल यह है कि, क्या आपको वास्तव में कीबोर्ड फोकस की आवश्यकता है?

मुझे एक और विकल्प सुझाने दें:

  1. अपने विंडो छोटी हैं, तो पुनर्स्थापित यह
  2. अपने विंडो सेट सर्वोच्च होने के लिए, जब अपने खिड़की सक्रिय है फिर शैली को हटा दें।
  3. कॉल SetForegroundWindow टास्कबार बटन (या FlashWindowEx)

इस फ़्लैश परिदृश्य जहां एक उपयोगकर्ता टाइपिंग और यहां तक ​​कि स्क्रीन पर देख के बिना अपने UI में कुछ क्रिया करने समाप्त होता है से बचना चाहिए।

संपादित करें:

HWND hwndFgnd=GetForegroundWindow(); 
SetWindowPos(hwnd,hwndFgnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE); 
SetWindowPos(hwndFgnd,hwnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); 

शायद काम ..will अगर आप (किसी भी बिंदु पर सर्वोच्च बिट सेट करने के लिए भले ही आपकी खिड़की ज़ेड-ऑर्डर के शीर्ष पर है नहीं करना चाहते, तो आप अभी भी SetForegroundWindow के साथ कानूनी रूप से ध्यान नहीं मिल सकता है)

0

यह भी एक बुरी समस्या है जिसका मुझे सामना करना पड़ा। मेरा समाधान here देखें। यह Show() और ShowDialog() दोनों के लिए काम करता है।

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