2009-03-27 15 views
5

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जो एक इंस्टॉलर के लिए बूटस्ट्रैप होता है जिसे मैं भी काम कर रहा हूं। एप्लिकेशन कुछ एमएसआई कॉल करता है जो मुझे प्राप्त करने के लिए आवश्यक जानकारी प्राप्त करने के लिए कुछ एमएसआई कॉल करता है जो कि मेरे एप्लिकेशन की मुख्य विंडो है, जो जानकारी एकत्र होने के दौरान प्रगति विंडो खोलने का कारण बनती है और फिर एक बार हो जाने के बाद दूर जाती है। फिर जादूगर स्थापित और लॉन्च किया गया है। मेरी समस्या यह है कि विज़ार्ड (सीप्रोपर्टी शीट से व्युत्पन्न) आगे नहीं आना चाहता और ऐसा करने के लिए कुछ कॉल जोड़ने के बिना सक्रिय एप्लिकेशन बनना नहीं चाहता।मैं अपने ऐप को सामने आने और फोकस करने के लिए कैसे मजबूर करूं?

मैं अपने OnInitDialog() विधि में निम्न कोड के साथ सामने करने के लिए इसे लाने की समस्या को हल कर दिया है:

SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // force window to top 
SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // lose the topmost status that the previous line gave us 

मेरे समस्या यह है कि मैं अभी भी पता लगा नहीं है कि कैसे खिड़की बनाने के लिए है आत्म-सक्रिय (यानी, स्वयं को वह बनाओ जिस पर ध्यान केंद्रित किया गया हो)। SetFocus() इस संदर्भ में काम नहीं करेगा। मुझे ऐसा कुछ चाहिए जो खिड़की को ज़ेड-ऑर्डर के शीर्ष पर मजबूर करे और इसे सक्रिय करे, अधिमानतः जितना संभव हो उतना कॉल करें।

मेरा अनुमान है कि एमएसआई कॉल द्वारा शुरुआत में खोला गया प्रगति विंडो मुख्य खिड़की को खराब करने का कारण बन रही है, लेकिन मेरे पास उस खिड़की को दिखने से रोकने का कोई तरीका नहीं है। इसके अलावा, इसे छिपाने के लिए यह समझ में नहीं आता है, क्योंकि यह उपयोगकर्ता को पता चलता है कि मुख्य विंडो आने से पहले क्या हो रहा है।

उत्तर

0

शोविंडो (youwindow, SW_SHOWNORMAL) काम नहीं करता है? -don

+0

ने कोशिश नहीं की है, लेकिन मुझे लगता है कि यह BringWindowToTop() से अधिक प्रभावी नहीं है। (मिच गेहूं के जवाब पर मेरी टिप्पणी देखें।) – RobH

0

आप पाएंगे कि BringWindowToTop या SetForegroundWindow में ऐसी आवश्यकताएं हैं जिन्हें विंडो से पहले सभी अन्य विंडोज़ (अनुप्रयोगों) के सामने मजबूर कर दिया जाएगा। यदि ये नहीं मिले हैं, तो विंडोज़ केवल टास्कबार में एप्लिकेशन के आइकन को फ्लैश करेगा। This आलेख इसके आस-पास एक तरीका प्रस्तुत करता है लेकिन 1800 जानकारी बताता है, इसकी अनुशंसा नहीं की जाती है। मुझे लगता है कि आपको बस इसे स्वीकार करना होगा।

+0

ऐसा मत करो। रेमंड चेन बताते हैं कि यह अक्सर आपके ऐप को क्यों लटकाता है: http://blogs.msdn.com/oldnewthing/archive/2008/08/01/8795860.aspx –

+0

धन्यवाद। मैंने अपना जवाब संपादित कर लिया है। –

7

आप फोकस चोरी नहीं कर सकते हैं। अवधि।

https://blogs.msdn.microsoft.com/oldnewthing/20090220-00/?p=19083

+1

धन्यवाद, मैं इस आलेख को इस प्रश्न के उत्तर के रूप में देख रहा था।कृपया इसे पढ़ने वाले सभी को, इसे आंतरिक बनाएं और वायरस मेम को ठीक करें जो अग्रभूमि सक्रियण चोरी करने का प्रयास करता है। लेकिन मेरा ऐप विशेष है! आपका ऐप उपयोगकर्ता विरोधी है। ऐसा मत करो! –

+1

मैं सहमत हूं और यद्यपि यह संभवतः लेखक पर लागू होता है, लेकिन वह (या किसी और के) इस कार्यक्षमता (बंद प्रणाली, निजी या घर कंप्यूटर केवल) की आवश्यकता के लिए एक अच्छा कारण हो सकता है। उपयोग पर एक सिफारिश करें लेकिन जानकारी छिपाएं। –

+1

मुझे आशा है कि माइक्रोसॉफ्ट होगा - कुछ दिन - आखिरकार सभी फोकस-चोरी को एक बार और सभी के लिए ठीक करें। फोकस-चोरी करने वाले प्रोग्रामर साइबेरिया को भेजे जाने चाहिए। नग्न। – snemarch

7

एंड्रयू पूरी तरह से सही नहीं है:

इस पुरानी नई बात लेख देखें। विंडोज आपको फोकस चोरी करने से रोकने के लिए वास्तव में कड़ी मेहनत करता है, लेकिन यह फोल्डिंग विधि का उपयोग करना संभव है।

  1. वर्तमान में फ़ोकस की गई विंडो के थ्रेड से अटैचमेंट करें।
  2. अपनी विंडो को फोकस में लाएं।
  3. धागे से अलग करें।

और उस के लिए कोड कुछ इस तरह जाना होगा:

DWORD dwCurrentThread = GetCurrentThreadId(); 
DWORD dwFGThread  = GetWindowThreadProcessId(GetForegroundWindow(), NULL); 


AttachThreadInput(dwCurrentThread, dwFGThread, TRUE); 

// Possible actions you may wan to bring the window into focus. 
SetForegroundWindow(hwnd); 
SetCapture(hwnd); 
SetFocus(hwnd); 
SetActiveWindow(hwnd); 
EnableWindow(hwnd, TRUE); 

AttachThreadInput(dwCurrentThread, dwFGThread, FALSE); 

आप या इस काम करने के लिए प्रशासनिक विशेषाधिकार के साथ अपने कार्यक्रम चलाने के लिए की आवश्यकता नहीं हो सकता है, लेकिन मैं इस का उपयोग किया है व्यक्तिगत रूप से कोड और यह काम पूरा हो गया है।

+0

यह विंडोज 10 1703 (रचनाकार अद्यतन) में काम नहीं करता है –

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

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