2010-05-25 17 views
13

मैं सीधे सी # में डेस्कटॉप पर आकर्षित करना चाहता हूं। थोड़ा सा खोज करने से, मैं डेस्कटॉप एचडीसी (शून्य) से ग्राफिक्स ऑब्जेक्ट का उपयोग कर समाप्त हुआ। फिर, मैंने सामान्य रूप से इस ग्राफिक्स ऑब्जेक्ट का उपयोग करके चित्रित किया।सी # में डेस्कटॉप पर प्रभावी ढंग से आकर्षित कैसे करें?

समस्या यह है कि स्क्रीन के किसी हिस्से को फिर से खींचा जाने पर मेरे आकार खो जाते हैं। मैंने थोड़ी देर लूप की कोशिश की, लेकिन यह वास्तव में जितना तेज़ हो सके उतना तेज़ी से ड्राइंग समाप्त हो जाता है, जो कि डेस्कटॉप की अद्यतन दर नहीं है।

आम तौर पर, मुझे अपने ड्राइंग कोड को "ऑनपेंट" ईवेंट में रखना होगा, लेकिन ऐसी चीज डेस्कटॉप के लिए मौजूद नहीं है।

मैं यह कैसे करूँगा?

उदाहरण कोड: https://stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c

+0

विंडोज का कौन सा संस्करण? – SLaks

उत्तर

8

जब आप एचडीसी (एनयूएलएल) को आकर्षित करते हैं तो आप एक अप्रबंधित तरीके से स्क्रीन पर आते हैं। जैसा कि आपने पाया है, जैसे ही स्क्रीन स्क्रीन के उस भाग को रीफ्रेश करती है, आपके परिवर्तन ओवरराइट किए जाते हैं।

वहाँ आप क्या हासिल करना चाहते पर निर्भर करता है, कुछ विकल्प होते हैं:

  1. सीमारहित, संभवतः गैर आयताकार खिड़की पैदा करते हैं। ( एक विंडो बनाने के लिए SetWindowRgn गैर-आयताकार।) आप इसे डेस्कटॉप विंडो का एक बच्चा बना सकते हैं।
  2. डेस्कटॉप विंडो उपclass। यह सीधा नहीं है, और इसमें Explorer.exe प्रक्रिया में एक डीएलएल इंजेक्शन शामिल है।
1

यह सही ढंग से करने के लिए मुश्किल है।

इसके बजाय अपने स्वयं के सीमाहीन फॉर्म बनाने के लिए यह बहुत आसान और अधिक विश्वसनीय होगा।

3

डेस्कटॉप आप डेस्कटॉप खिड़की उपवर्ग और जब यह एक WM_PAINT/WM_ERASEBKGND संदेश प्राप्त करता है अपने ड्राइंग तर्क का उपयोग करने की आवश्यकता होगी के लिए एक OnPaint प्राप्त करने के लिए।

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

जैसा कि एक पारदर्शी विंडो का उल्लेख करने का एक और तरीका है, या (अद्यतन आवृत्ति के आधार पर) एक अस्थायी वॉलपेपर की प्रतिलिपि बनाना, चित्र बनाना और सेट करना (bginfo करता है)।

15

मैं एक ऐसी ही आवश्यकता के लिए दो समाधान तैनात here

मूल रूप से आप दो विकल्प हैं।

1- डेस्कटॉप के लिए एक ग्राफिक्स ऑब्जेक्ट प्राप्त करें और इसे चित्रित करना प्रारंभ करें। समस्या अगर आप समाशोधन आपने पहले तैयार की है क्या आदि

Point pt = Cursor.Position; // Get the mouse cursor in screen coordinates 

using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) 
{   
    g.DrawEllipse(Pens.Black, pt.X - 10, pt.Y - 10, 20, 20); 
} 

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

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

BackColor = Color.LightGreen; 
TransparencyKey = Color.LightGreen; 
+0

संभवतः यह * पूर्ण * स्क्रीन अनुप्रयोगों (गेम इत्यादि) के लिए काम नहीं करेगा? – acron

+2

किसी को GetDesktopWindow() को Graphics.FromHwnd() में पास करना चाहिए क्योंकि IntPtr.Zero एक कार्यान्वयन विवरण है जो बदल सकता है, और निश्चित रूप से ** ** ** बहु-डेस्कटॉप या बहु-सत्र वर्कस्टेशन के लिए काम नहीं करेगा। –