2008-10-15 14 views
17

क्या यह निर्दिष्ट करने का कोई तरीका है कि डेल्फी या सी ++ बिल्डर में कौन सा मॉनीटर दिखाई देता है?एक दूसरे मॉनीटर पर प्रोग्राम शुरू करें?

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

उत्तर

22

प्रोग्राम शटडाउन से पहले विंडो स्थिति सहेजें और स्टार्टअप पर उन्हें पुनर्स्थापित करें। मल्टीमोनिटर डिस्प्ले बस डेस्कटॉप के आकार को बढ़ाता है; अन्य मॉनीटर सतहों में प्राथमिक एक्सचेंज के ऊपरी-बाईं ओर स्थित मूल एक्स/वाई विमान का एक अलग अनुभाग होता है।

यह आपके लिए any of several components द्वारा स्वचालित रूप से किया जा सकता है।

बीटीडब्लू, फॉर्म यूनिट में स्क्रीन वैरिएबल में मॉनिटरकाउंट और एक अन्य अनुक्रमणीय संपत्ति, मॉनीटर [इंडेक्स: इंटीजर]: टीएमओनिटर नामक एक संपत्ति है। टीएमओनिटर में बाएं, शीर्ष, चौड़ाई, ऊंचाई इत्यादि का संकेत मिलता है, इसलिए आपको जो भी जानकारी चाहिए वह वहां है।

+0

धन्यवाद, मैंने स्क्रीन का उपयोग किया। मॉनिटरकाउंट जैसा कि आपने और जिम ने सुझाव दिया था। – stukelly

+6

स्टार्टअप पर सेटिंग्स का उपयोग करने से पहले आपको सहेजे गए मॉनिटर को भी सत्यापित करना चाहिए। अन्यथा यदि आपकी स्क्रीन उस मॉनिटर को हटा देती है जो वहां मौजूद होता है तो आपकी विंडो स्क्रीन पर दिखाई नहीं देगी। – anon6439

+0

नकारात्मक स्क्रीन निर्देशांक पर एक ऐप शुरू करना हमेशा उपयोगकर्ताओं को यह देखने में मजेदार होता है कि ऐप को कैसे दिखाया जाए ... –

-4

मैं विंडोज सिस्टम के साथ बहुत कुछ नहीं करता, इसलिए मैं इस तरह एक हैक का सुझाव दूंगा।

देखने योग्य डेस्कटॉप (दोनों मॉनीटर संयुक्त) की चौड़ाई पकड़ो, इसे आधे से विभाजित करें और अपनी प्रारंभिक स्थिति बनाएं।

आप यह भी देख सकते हैं कि एपीआई आपको मॉनीटर 2 के आयाम बताता है।

+1

यह केवल अगर दोनों पर नज़र रखता है एक ही आकार के डेस्कटॉप काम करेगा। – Re0sless

+0

@ReOsless: हां। जैसे मैंने कहा कि यह एक हैक है। –

-3

विंडोज आपको CreateWindow API कॉल में विंडो के निर्देशांक निर्दिष्ट करने देगा। मुझे यह जानने के लिए डेल्फी या सी ++ बिल्डर के बारे में पर्याप्त जानकारी नहीं है कि क्या आपके पास प्रक्रिया के उस हिस्से तक पहुंच है या नहीं।

आप विंडो को WM_CREATE हैंडलर में स्थानांतरित करने में भी सक्षम हो सकते हैं।

EnumDisplayMonitors आपको सिस्टम में प्रत्येक मॉनिटर के निर्देशांक देगा।


स्पष्ट रूप से डेल्फी और सी ++ बिल्डर में ऐसी सुविधाएं हैं जो इस उत्तर को कुछ अप्रासंगिक बनाती हैं। यदि कोई इस प्रश्न पर आता है तो मैं इसे यहां छोड़ दूंगा लेकिन इसे किसी भिन्न वातावरण के लिए उत्तर देने की आवश्यकता है।

+2

डेल्फी के पास इन सभी कार्यों को कवर करने के लिए अवशोषण हैं, स्क्रीन से। मॉनीटर संग्रह फॉर्म स्थिति को नियंत्रित करने के लिए पूर्व-निर्माण कार्यक्रमों के माध्यम से संग्रहित करता है। –

1

वास्तव में आपके प्रश्न का उत्तर नहीं है, लेकिन जब भी एप्लिकेशन बंद हो, तब आप खिड़की सेटिंग्स (आकार, स्थिति, अधिकतम राज्य) को स्टोर नहीं कर सकते, और फिर उन्हें स्टार्टअप पर लागू कर सकते हैं?

+0

यह सबसे सरल कार्यान्वयन – benPearce

+2

इसमें कोई समस्या है।क्या होता है यदि एप्लिकेशन का उपयोग करने के बाद कंप्यूटर से दूसरे मॉन्टोर को हटा दिया जाता है? (MySQL क्वेरी ब्रोअर में यह समस्या है) –

25

वैश्विक स्क्रीन ऑब्जेक्ट (फॉर्म का हिस्सा) में मॉनीटर की अवधारणा है। मुझे लगता है कि इस डेल्फी 6 या 7 लगभग जोड़ा गया है निम्नलिखित कोड काम करेगा:

// Put the form in the upper left corner of the 2nd monitor 
// if more then one monitor is present. 
if Screen.MonitorCount > 1 then 
begin 
    Left := Screen.Monitors[1].Left; 
    Top := Screen.Monitors[1].Top; 
end; 

आपको लगता है कि मॉनिटर में कहीं भी यह डाल करने के लिए किसी भी सकारात्मक है कि स्थिति से ऑफसेट इस्तेमाल कर सकते हैं। आयामों को जानने के लिए आप वहां से चौड़ाई और ऊंचाई भी प्राप्त कर सकते हैं।

+1

नमूना कोड के लिए धन्यवाद, यह बहुत अच्छा काम करता है। – stukelly

-2

मैं डेल्फी 5 में थोड़ी देर पहले एक ऐसी ही बात किया है:

procedure TForm18.FormCreate(Sender: TObject); 
var 
    Mon: TMonitor; 
    MonitorIdx: Integer; 
begin 
    MonitorIdx := 1; // better read from configuration 
    if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin 
    Mon := Screen.Monitors[MonitorIdx]; 
    Left := Left + Mon.Left - Monitor.Left; 
    Top := Top + Mon.Top - Monitor.Top; 
    end; 
end; 
1
procedure TMDIChild.btnShowMonClick(Sender: TObject); 
begin 
    if Screen.MonitorCount > 1 then 
    begin 
     FormShow.Left:=Screen.Monitors[1].Left; 
     FormShow.Top:=Screen.Monitors[1].Top; 
     FormShow.Width:=Screen.Monitors[1].Width; 
     FormShow.Height:=Screen.Monitors[1].Height; 
    end 
    else 
    begin 
     FormShow.Show; 
    end; 
end; 
संबंधित मुद्दे