2008-10-17 19 views
5

मैं उन उपयोगकर्ताओं के साथ एक अजीब समस्या को डीबग करने का प्रयास कर रहा हूं जिनके पास LogMeIn स्थापित है। कुछ दिनों के बाद, मेरे कुछ ऐप खोलने वाले मेरे कुछ संवाद ऑफस्क्रीन समाप्त कर सकते हैं। अगर मैं विश्वसनीय रूप से इसका पता लगा सकता हूं, तो मैं प्रोग्राम्सिक रूप से उन संवादों को वापस ले जा सकता हूं जहां वे फिर से दिखाई दे रहे हैं।यह निर्धारित करने के लिए कि कोई विंडोज एप्लिकेशन ऑफस्क्रीन है या नहीं?

नोट: इसे एकाधिक मॉनीटर के लिए काम करना है और Win32 API का उपयोग करना है। हालांकि, अगर आपको पता है कि .NET से इसे कैसे किया जाए तो मैं शायद वहां से बाहर निकल सकता हूं ...

अपडेट: उत्सुकता के लिए, ऊपर वर्णित बग WxWidgets के साथ करना है। यदि आप wxwidgets एप्लिकेशन चलाते हैं, तो चले जाओ और अपने स्क्रीन सेवर को जाने दें, फिर LogMeIn के साथ दूरस्थ रूप से लॉग इन करें, फिर अपने ऐप से एक संवाद खोलने का प्रयास करें, यदि आप wxDisplay :: GetFromPoint (pos) या wxWindowBase का उपयोग करते हैं तो आपको परेशानी होगी :: केंद्र() संवाद की स्थिति में।

+0

एफवाईआई: टास्क बार में ऑफस्क्रीन विंडो पर राइट-क्लिक करें, चाल का चयन करें, और एक तीर कुंजी दबाएं (इसे माउस पर कूदना चाहिए)। फिर चाल को पूरा करने के लिए माउस या चाबियों का उपयोग करें। – Aardvark

+0

एएलटी + स्पेस भी काम करता है। – kgriffs

+0

यदि आपको लगता है कि यह wxwidgets में एक बग है, तो क्या आपने इसकी सूचना दी है? –

उत्तर

8

बस मॉनिटर_DEFAULTTONULL ध्वज के साथ MonitorFromWindow का उपयोग करें। यदि वापसी मूल्य शून्य है, तो आपकी विंडो दिखाई नहीं दे रही है। आप निकटतम मॉनिटर पर अपनी विंडो को स्थानांतरित करने में सक्षम होने के लिए बाद में MONITOR_DEFAULTTONEAREST पास कर सकते हैं।

+0

मेरा उत्तर हटाने - MONITOR_DEFAULTTONULL ध्वज सही लगता है ... – Aardvark

+0

मैं मॉनीटरफ्रॉमपॉइंट का उपयोग कर समाप्त हुआ, जो मॉनिटरफ्रॉमविंडो के समान काम करता है। – kgriffs

-1

हम्म। यह मदद नहीं कर सकता है, लेकिन जब मैंने वीबी किया था, तो आप स्क्रीन.विड्थ और स्क्रीन.हेइट, और फिर window.x और window.y ...

बेशक, मुझे नहीं पता कि यह कैसे काम करता है एकाधिक मॉनीटर

1

.NET में, आप प्राथमिक स्क्रीन की सीमाएं प्राप्त करने के लिए स्क्रीन.प्रिमरीस्क्रीन। वर्किंग एरिया संरचना का उपयोग करते हैं (स्क्रीन .क्रैन [x]। अन्य मॉनीटर के लिए वर्किंग एरिया, मुझे लगता है), और फिर बाएं और शीर्ष गुणों का उपयोग करें खिड़की के बाहर यह पता लगाने के लिए कि खिड़की कहाँ है (यदि यह स्क्रीन से बाहर है, तो शीर्ष और बाएं [स्क्रीन] से बड़े होंगे। विड्थ और हाइट।

1

.NET में, मैं स्क्रीन में प्रत्येक स्क्रीन पर फिर से चालू होगा। ऑलस्क्रीन, फिर या तो कॉल स्क्रीन। बाउंड। आपके फॉर्म के आयताकार को पास करता है (यदि आप यह सुनिश्चित करना चाहते हैं कि आपकी सभी विंडो सीमाओं (*) के भीतर है, या स्क्रीन पर कॉल करें। बाउंड्स। इंटरसेक्ट्स विथ() यदि आप केवल यह सुनिश्चित करना चाहते हैं आपके फॉर्म का कम से कम एक हिस्सा दिखाई देता है।

(*) एक स्क्रीन सीमा के भीतर पूरी तरह से नहीं होने का मतलब यह नहीं है कि यह कुल स्क्रीन की सीमाओं के भीतर नहीं है। आप अपने स्क्रीन के आयताकार का परीक्षण करने के लिए एक आयताकार बनाने के लिए प्रत्येक आय सीमाओं पर आयत को भी कॉल कर सकते हैं। लेकिन फिर आपको यह देखना होगा कि स्क्रीन सीमाएं एक ही आकार के नहीं हैं, क्योंकि englobing आयताकार पूरी तरह से दिखाई नहीं दे रहा है।

यह लंबा उत्तर था। छोटा यह है: मुझे पता नहीं है कि कोई आसान तरीका नहीं है।

0

ऐसा लगता है कि GetMonitorInfo() डैनी के सुझाव के Win32 समकक्ष है। मुझे यकीन नहीं है कि आप सिस्टम पर सभी मॉनीटरों के लिए एक हनीटर प्राप्त करने के बारे में कैसे जाएंगे, लेकिन ऐसा लगता है कि प्रलेखन से जुड़े उदाहरण में ऐसा करने के कुछ तरीके हैं।

1

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

1

भी देखें How can I get the active screen dimensions?

इस कोड मैं प्रपत्र निर्माता में प्रयोग किया जाता है कि यह एक जल्दी है एक दृश्य परदे के लिए प्रपत्र को स्थानांतरित करने के बाद आप अपने लैपटॉप अनडॉक या है जो भी हो आप कुछ स्क्रीन अचल संपत्ति जाने के लिए किया था दूर। अपनी खपत के लिए परिष्कृत करें।

if (!Screen.FromControl(this).Bounds.Contains(this.Location)) 
      { 
       this.DesktopLocation = new Point(100,100); 
      } 
संबंधित मुद्दे

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