विंडोज एक्सपी और ऊपर में, एक विंडो हैंडल (एचडब्ल्यूएनडी) दिया गया है, मैं कैसे बता सकता हूं कि खिड़की की स्थिति और आकार खिड़की को स्क्रीन से अनजाने में छोड़ देता है? उदाहरण के लिए, यदि शीर्षक बार कर्सर पर उपलब्ध है, तो विंडो को स्क्रीन पर वापस खींच लिया जा सकता है। मुझे यह पता लगाने की ज़रूरत है कि खिड़की वास्तव में दिखाई दे रही है या कम से कम उपयोगकर्ता के लिए उपलब्ध है या नहीं। मुझे लगता है कि मुझे यह जानने की भी आवश्यकता है कि संकल्प परिवर्तनों का पता लगाने और जवाब देने और एकाधिक मॉनीटर से निपटने के तरीके का जवाब कैसे दिया जाए। यह काफी बड़ा सौदा लगता है। मैं सी ++ और नियमित एसडीके का उपयोग कर रहा हूं, इसलिए कृपया सी # या इसी तरह के आविष्कार के बजाय उस प्लेटफॉर्म पर अपने उत्तरों को सीमित करें।मैं कैसे निर्धारित करूं कि खिड़की ऑफ-स्क्रीन है या नहीं?
उत्तर
विंडोज प्राथमिक मॉनीटर पर उपयोगकर्ता के कार्यक्षेत्र के आकार को निर्धारित करने के लिए अपेक्षाकृत सरल बनाता है (यानी, स्क्रीन का क्षेत्र टास्कबार द्वारा अस्पष्ट नहीं है)। SystemParametersInfo
function पर कॉल करें और पहले पैरामीटर (uiAction
) के लिए SPI_GETWORKAREA
ध्वज निर्दिष्ट करें। pvParam
पैरामीटर को RECT
structure पर इंगित करना चाहिए जो वर्चुअल स्क्रीन निर्देशांक में कार्यक्षेत्र के निर्देशांक प्राप्त करेगा।
एक बार जब आप कामकाजी क्षेत्र का वर्णन करने वाले निर्देशांक प्राप्त कर लेते हैं, तो यह निर्धारित करने के लिए कि यह उन सीमाओं के भीतर है या नहीं, यह निर्धारित करने के लिए आपके एप्लिकेशन की विंडो की वर्तमान स्थिति की तुलना करना एक साधारण बात है।
एकाधिक मॉनीटर का समर्थन करने की इच्छा चीजों को थोड़ा और जटिल बनाती है। SystemParametersInfo
के लिए प्रलेखन से पता चलता है कि प्राथमिक के अलावा मॉनीटर के कार्यक्षेत्र को पाने के लिए आपको GetMonitorInfo
function पर कॉल करने की आवश्यकता है। यह MONITORINFOEX
नामक संरचना में भरता है जिसमें सदस्य rcWork
होता है जो उस मॉनीटर के कार्यक्षेत्र को परिभाषित करता है, फिर वर्चुअल स्क्रीन निर्देशांक में RECT
संरचना के रूप में व्यक्त किया जाता है।
यह करने के लिए, आपको सिस्टम से कनेक्ट होने वाले सभी मॉनीटरों की गणना करने और GetMonitorInfo
का उपयोग करके प्रत्येक के कार्यक्षेत्र को पुनर्प्राप्त करने की आवश्यकता होगी।
पास इसके कुछ नमूने इंटरनेट के आसपास पाया जा सकता हैं:
- MSDN Positioning Objects on a Multiple Display Setup के लिए कुछ नमूना कोड है।
- यदि आप एमएफसी का उपयोग कर रहे हैं, तो यहां कई मॉनीटर समर्थन के an excellent example होने की संभावना है।
- भले ही आप एमएफसी का उपयोग नहीं कर रहे हैं, यह आलेख the following link को संदर्भित करता है जो कि वास्तविक मणि दिखता है, यह बताते हुए कि विंडोज़ में एकाधिक मॉनीटर कैसे काम करता है, भले ही यह थोड़ा पुराना स्कूल हो। इसकी तरह या नहीं, विंडोज के बाद के संस्करणों में इसका बहुत कम बदल गया है।
अंत में, आपने संकल्प परिवर्तनों का पता लगाने का उल्लेख किया है। यह शायद कल्पना की तुलना में यह बहुत आसान है। जैसा कि आप जानते हैं कि आपने कोई विंडोज प्रोग्रामिंग किया है, ऑपरेटिंग सिस्टम आपके आवेदन के साथ संचार करने का प्राथमिक तरीका है WindowProc
function पर संदेश भेजना।
इस मामले में, आप WM_DISPLAYCHANGE
message के लिए देखना चाहते हैं, जो डिस्प्ले रेज़ोल्यूशन बदलते समय सभी विंडो पर भेजा जाता है। wParam
बिट्स प्रति पिक्सेल में नई छवि गहराई है; lParam
का निम्न-आदेश शब्द क्षैतिज संकल्प निर्दिष्ट करता है और lParam
का उच्च-आदेश शब्द स्क्रीन के लंबवत संकल्प को निर्दिष्ट करता है।
दृश्यता जांच वास्तव में आसान है।
RECT rtDesktop, rtView;
GetWindowRect(GetDesktopWindow(), &rtDesktop);
GetWindowRect(m_hWnd, &rtView);
HRGN rgn = CreateRectRgn(rtDesktop.left, rtDesktop.top, rtDesktop.right, rtDesktop.bottom);
BOOL viewIsVisible = RectInRegion(rgn, &rtView);
DeleteObject(rgn);
आपको RectInRegion का उपयोग करने की आवश्यकता नहीं है, मैं कोड को छोटा करने के लिए उपयोग करता हूं।
प्रदर्शन, संकल्प परिवर्तन निगरानी भी आसान है यदि आप WM_SETTINGCHANGE संदेश को संभालते हैं।
http://msdn.microsoft.com/en-us/library/ms725497(v=vs.85).aspx
अद्यतन
रूप @Cody ग्रे बताया गया है, मुझे लगता है कि WM_DISPLAYCHANGE WM_SETTINGCHANGE से अधिक उपयुक्त है। लेकिन एमएफसी 9.0 लाइब्रेरी WM_SETTINGCHANGE का उपयोग करती है।
- 1. यह निर्धारित करने के लिए कि कोई विंडोज एप्लिकेशन ऑफस्क्रीन है या नहीं?
- 2. मैं कैसे निर्धारित करूं कि एक .NET अनुप्रयोग 32 या 64 बिट है या नहीं?
- 3. मैं कैसे निर्धारित करूं कि System.Type एक कस्टम प्रकार या फ्रेमवर्क प्रकार है या नहीं?
- 4. मैं कैसे निर्धारित करूं कि निष्पादन असेंबली एक वेब ऐप या विनफॉर्म/कंसोल है या नहीं?
- 5. मैं कैसे निर्धारित करूं कि एक्सेल वीबीए
- 6. मैं कैसे निर्धारित करूं कि पृष्ठ जावास्क्रिप्ट के माध्यम से सुरक्षित है या नहीं?
- 7. मैं कैसे निर्धारित करूं कि कोई ऑब्जेक्ट पर्ल में एक विधि लागू करता है या नहीं?
- 8. मैं कैसे निर्धारित करूं कि सी # में कोई प्रक्रिया प्रबंधित की जाती है या नहीं?
- 9. मैं कैसे निर्धारित करूं कि PHP में कोई सरणी खाली है या नहीं?
- 10. मैं कैसे निर्धारित करूं कि SQL सर्वर में डेटाबेस भूमिका मौजूद है या नहीं?
- 11. मैं कैसे निर्धारित करूं कि शेल स्क्रिप्टिंग के साथ कोई वेब पेज मौजूद है या नहीं?
- 12. कोल्डफ्यूज़न में, मैं कैसे निर्धारित करूं कि कोई क्वेरी स्ट्रिंग चर मौजूद है या नहीं?
- 13. मैं कैसे निर्धारित करूं कि वर्तमान उपयोगकर्ता स्थान मेरे MKCoordinateRegion के अंदर है या नहीं?
- 14. .NET: मैं कैसे निर्धारित करूं कि कोई ऑब्जेक्ट COM COM है या नहीं?
- 15. मैं कैसे निर्धारित करूं कि चेकबॉक्स चेक किया गया है या नहीं?
- 16. मैं कैसे निर्धारित करूं कि कोई छवि फ़ोटोशॉप कर दी गई है या नहीं?
- 17. मैं कैसे निर्धारित करूं कि एक मल्टीमैप में कोई विशेष कुंजी अद्वितीय है या नहीं?
- 18. मैं कैसे निर्धारित करूं कि पाइथन एसक्लाइट अद्यतन काम करता है या नहीं?
- 19. मैं कैसे निर्धारित करूं कि यह PHP के साथ एक मोबाइल डिवाइस है या नहीं?
- 20. मैं कैसे निर्धारित करूं कि कोई पाथ्रेड जीवित है या नहीं?
- 21. बनावट या ऑफस्क्रीन फ्रेमबफर
- 22. मैं कैसे निर्धारित करूं कि svn: mergeinfo दूषित है और मैं इसे कैसे ठीक करूं?
- 23. मैं कैसे निर्धारित कर सकता हूं कि एक विंडो हैंडल मान्य है या नहीं?
- 24. मैं कैसे निर्धारित करूं कि PowerShell Cmdlet पैरामीटर मान निर्दिष्ट किया गया था या नहीं?
- 25. मैं कैसे निर्धारित करूं कि एनएसडीएटी (समय समेत)
- 26. मैं कैसे निर्धारित करूं कि एक पर्ल फ़ाइल हैंडल एक पढ़ा या लिखने वाला हैंडल है या नहीं?
- 27. मैं कैसे निर्धारित करूं कि एनम मूल्य में एक या अधिक मूल्यों की तुलना की जा रही है या नहीं?
- 28. मैं कैसे निर्धारित कर सकता हूं कि एक div नीचे स्क्रॉल किया गया है या नहीं?
- 29. मैं कैसे निर्धारित कर सकता हूं कि मेरा टेक्स्टब्लॉक टेक्स्ट छंटनी जा रहा है या नहीं?
- 30. मैं कैसे निर्धारित करूं कि मेरा .NET विंडोज फॉर्म प्रोग्राम किस मॉनीटर पर चल रहा है?
धन्यवाद, यह एक उत्कृष्ट शुरुआत है - मुझे विश्वास नहीं है कि मैं पहले SystemParametersInfo में नहीं आया हूं। मैं अभी भी समस्या के साथ फंस गया हूं कि शीर्षक बार दिखाई दे रहा है या नहीं, और यदि संकल्प में परिवर्तन होता है तो क्या होता है। – hatcat
@hatcat: खुद को हरा करने का कोई कारण नहीं; विंडोज एपीआई बड़ा है और कोई भी सब कुछ नहीं जानता है। मुझे यकीन नहीं है कि आप अभी भी टाइटल बार की दृश्यता पर कैसे फंस सकते हैं। यह देखने के लिए जांचें कि शीर्षक विंडो वाले आपकी विंडो का क्षेत्र स्क्रीन के कार्यक्षेत्र में स्थित है या नहीं, जिसे आपने ऊपर वर्णित कार्यों में से किसी एक का उपयोग किया है। और मैं सीधे संकल्प परिवर्तन का पता लगाने के बारे में भूल गया; मैं अपना जवाब अपडेट करूंगा। –
धन्यवाद! मैं 1 99 2 से विंडोज प्रोग्रामिंग कर रहा हूं, मान लीजिए या नहीं। मुझे लगता है कि सबसे कठिन बात यह जानती है कि कार्यक्षमता को किस प्रकार से हटा दिया गया है, और कब, और क्या आपको पता है कि आपको क्या पता होना चाहिए या नहीं। टाइटल बार भाग उस क्षेत्र को पुनः प्राप्त करने के साथ और अधिक था इसलिए मैं इसका परीक्षण कर सकता था। मैं बस शीर्ष दस पिक्सेल और पक्ष दस पिक्सेल की जांच करने जा रहा हूं, जो पर्याप्त होना चाहिए। – hatcat