2009-07-13 13 views
31

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

मैं वर्तमान स्क्रीन के आकार को निर्धारित करने के लिए स्क्रीन क्लास का उपयोग कर रहा हूं लेकिन मुझे यह निर्धारित करने के लिए कुछ भी नहीं मिल रहा है कि एप्लिकेशन किस स्क्रीन पर चल रहा था।

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

+0

प्रदान करते हैं http://stackoverflow.com/questions/937298/restoring-window-size को यह नहीं एक समान प्रश्न -पोजीशन-साथ-एकाधिक-मॉनीटर – sgmoore

उत्तर

46

आप इस कोड का उपयोग कर स्क्रीन की एक सरणी प्राप्त कर सकते हैं।

Screen[] screens = Screen.AllScreens; 

तुम भी पता लगा सकते हैं इस कोड चलाने कम की जाँच स्क्रीन वर्ग और स्थिर में

Screen screen = Screen.FromControl(this); //this is the Form class 

(इस खिड़कियों के रूप में आप पर कर रहे हैं) द्वारा कौन-सी स्क्रीन पर हैं, सहायक तरीके, वे आपकी मदद कर सकते हैं।

MSDN Link, इसमें बहुत कुछ नहीं है .. मैं आपके द्वारा कोड में चारों ओर गड़बड़ करने का सुझाव देता हूं।

+0

हां, लोग भूल जाते हैं कि फ़ॉर्म नियंत्रण से प्राप्त होता है , तो स्क्रीन। फ्रॉम कंट्रोल इस पर काम करेगा। – Powerlord

+4

शायद मुझे इसे फिर से बदलना चाहिए ... कंटेनर नियंत्रण से फॉर्म विरासत, जो स्क्रॉलबल कंट्रोल से विरासत में मिलता है, जो नियंत्रण से विरासत में मिलता है। – Powerlord

+0

यह पूरी तरह से गलत है – Janie

6

यदि आपको विंडो का स्थान और आकार याद है, तो यह पर्याप्त होगा। जब आप पहले इस्तेमाल की गई स्थिति में स्थिति सेट करते हैं, यदि यह दूसरी मॉनीटर पर होता है तो यह वहां वापस जायेगा।

उदाहरण के लिए, यदि आपके पास 2 मॉनीटर हैं, तो दोनों 1280x1024 आकार में हैं और आप अपनी विंडो की बायीं स्थिति 2000px होने के लिए सेट करते हैं, यह दूसरी मॉनीटर पर दिखाई देगा (माना जाता है कि दूसरा मॉनिटर पहले के दाईं ओर है।) :)

आप दूसरे वहाँ नहीं किया जा रहा है जब आवेदन अगली बार प्रारंभ होने पर नजर रखने के बारे में चिंतित हैं, तो आप यह निर्धारित करने के अपने विंडो स्क्रीन के किसी भी काटती है, तो इस विधि का उपयोग कर सकते हैं:

private bool isWindowVisible(Rectangle rect) 
{ 
    foreach (Screen screen in Screen.AllScreens) 
    { 
     if (screen.Bounds.IntersectsWith(rect)) 
      return true; 
    } 
    return false; 
} 

बस में पास आपकी खिड़की की वांछित स्थान और यह आपको बताएगी कि क्या यह स्क्रीन में से एक पर दिखाई देगी। का आनंद लें! System.Windows.Forms.Screen

प्रारंभ कुछ इस तरह के साथ खेल:

+1

सहमत हैं, लेकिन स्टार्टअप पर कुछ जांच अच्छी होगी, ताकि एक पुनर्गठन के बाद आपका ऐप सभी मॉनीटर –

+0

से बाहर न हो, असल में, अगर कोई दूसरा मॉनीटर हटा देता है और आपका एप्लिकेशन कोशिश करेगा पिछले मॉनीटर से पिछले सत्र से ऊपर/बाएं का उपयोग करें, विंडोज स्वचालित रूप से इसे पहले मॉनीटर पर ले जायेगा। तो व्यावहारिक रूप से, आपको isWindowVisible विधि को कॉल करने की आवश्यकता नहीं है। – SolutionYogi

+0

मैं हेनक से सहमत हूं - मैंने जो उदाहरण जोड़ा है उसे जांचें ताकि आप जांच सकें कि आपकी विंडो दिखाई देगी या नहीं। :) –

0

आप 'स्क्रीन' वस्तु का उपयोग कर सकते

 Screen[] screens = Screen.AllScreens; 
     for (int i = 0; i < screens.Length ; i++) 
     { 
      Debug.Print(screens[i].Bounds.ToString()); 
      Debug.Print(screens[i].DeviceName); 
      Debug.Print(screens[i].WorkingArea.ToString()); 
     } 

यह हो सकता है आपको मिल आपको क्या चाहिए

4

आप

var s = Screen.FromControl(this); 

जहां this फॉर्म (या फॉर्म पर कोई नियंत्रण) है के साथ वर्तमान स्क्रीन प्राप्त कर सकते हैं। कैसे याद रखना है कि यह थोड़ा मुश्किल है, लेकिन मैं स्क्रीन में इंडेक्स के लिए जाऊंगा। AllScreens सरणी, या शायद s.DeviceName। किसी भी मामले में, डिस्कनेक्ट किए गए मॉनीटर का उपयोग रोकने से रोकने के लिए स्टार्टअप पर सेटिंग्स का उपयोग करने से पहले जांचें।

+1

मैं डिवाइस नाम के लिए नहीं जाऊंगा, डिवाइसनाम किसी भी समय बदल सकता है, कहें कि जब आपको कोई नया वीडियो कार्ड मिलता है या मॉनीटर होता है ... –

+0

मैं उन्हें Vista पर \\। \ DISPLAY1 और \\। \ DISPLAY2 के रूप में प्राप्त करता हूं। लेकिन यह XP के लिए अलग हो सकता है, मुझे यकीन नहीं है। –

+0

मैं मानता हूं, कोई भी वास्तव में निश्चित नहीं है..इसलिए मैं इसका उपयोग नहीं करूँगा। :) –

3

फॉर्म का स्थान आपको बताएगा कि फ़ॉर्म किस स्क्रीन पर है। मैं वास्तव में समझ में नहीं आता कि आपको यह जानने की आवश्यकता क्यों है कि यह किस स्क्रीन पर है, क्योंकि यदि आप इसे सहेजे गए स्थान का उपयोग करके इसे पुनर्स्थापित करते हैं तो इसे केवल उसी स्थान पर पुनर्स्थापित करना चाहिए (शायद आप क्यों विस्तार कर सकते हैं)।

Screen[] scr = Screen.AllScreens; 
scr[i].Bounds.IntersectsWith(form.Bounds); 

प्रत्येक स्क्रीन एक सीमा संपत्ति जो एक आयत देता है:

नहीं तो आप कुछ इस तरह कर सकते हैं। यह निर्धारित करने के लिए कि फॉर्म स्क्रीन के भीतर है या नहीं, आप IntersectsWith() फ़ंक्शन का उपयोग कर सकते हैं।

इसके अलावा, वे मूल रूप से एक समारोह है कि इस स्क्रीन वर्ग के साथ-साथ करता

Screen screen = Screen.FromControl(form); 
संबंधित मुद्दे

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