2009-10-08 9 views
14

इस प्रश्न को अन्य भाषाओं के लिए भी पूछा गया है, और यहां तक ​​कि उन अन्य भाषाओं के लिए, मैंने पाया है कि वास्तव में इसे कैसे किया जाए, स्पष्ट रूप से (कोई गड़बड़ स्क्रीन पश्चाताप नहीं है)।सीधे विंडोज डेस्कटॉप पर कैसे आकर्षित करें, सी #?

क्या यह विंडोज डेस्कटॉप पर सी # से आकर्षित करना संभव है? यदि संभव हो तो मैं एक उदाहरण की तलाश में हूं।

+7

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

उत्तर

25

निम्नलिखित का प्रयास करें:

using System; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Runtime.InteropServices; 

class Program { 

    [DllImport("User32.dll")] 
    static extern IntPtr GetDC(IntPtr hwnd); 

    [DllImport("User32.dll")] 
    static extern int ReleaseDC(IntPtr hwnd, IntPtr dc); 

    static void Main(string[] args) { 
     IntPtr desktop = GetDC(IntPtr.Zero); 
     using (Graphics g = Graphics.FromHdc(desktop)) { 
      g.FillRectangle(Brushes.Red, 0, 0, 100, 100); 
     } 
     ReleaseDC(IntPtr.Zero, desktop); 
    } 
} 
+6

उन लोगों के लिए एफवाईआई जो कहते हैं कि आप नहीं कर सकते हैं, यह मेरे लिए काम करता है, हालांकि किसी भी खिड़की को आगे बढ़ाना इसे तुरंत पछतावा करता है :( – esac

+0

मैंने अभी इसे एक WPF, C# 4.0 एप्लिकेशन में आजमाया है और मुझे "PInvokeStackImbalance का पता चला" जैसे ही मैंने इसे लॉन्च करने के बाद माउस को ले जाया। बस – Alex

+0

से गुज़रने वाले अन्य लोगों के लिए एक एफवाईआई मुझे एक ही असंतुलित स्टैक त्रुटि मिली। क्या फिक्स है? अपनी परियोजना को 3.5 क्लाइंट प्रोफाइल में वापस बदलें? :) – gonzobrains

8

आप कोशिश कर सकते हैं:

Graphics.FromHwnd(IntPtr.Zero) 
+2

पाओलो टेडेस्को का जवाब मेरे लिए काम करता था, लेकिन बंद हो गया और मुझे पता नहीं चला कि क्यों। लेप्पी के जवाब ने मुझे फिर से काम किया। – chrismead

+0

अगर मैं ड्राइंग को गायब होने से रोकने के लिए इसे टाइमर में डालता हूं तो यह झिलमिलाहट करता है ... – beppe9000

3

आप के भीतर https://uiautomationverify.codeplex.com/SourceControl/latest#UIAVerify/Tools/visualuiverify/utils/screenrectangle.cs

एक वास्तविक दुनिया कोड उदाहरण देख सकते हैं यह एक आयत है कि पर दिखाई देगा ड्रॉ स्क्रीन जब तक उपयोगकर्ता इसे मनमानी स्थिति में हटाने के लिए चुनता है (जिसे पुन: चित्रित नहीं किया जाएगा)। यह एक विंडोज़ फॉर्म का उपयोग करता है जो पॉपअप के रूप में छुपा/प्रकट होता है।

यह वर्तमान विंडोज एसडीके में UIAVerify.exe उपकरण के पीछे कोड है।

आप ऊपर का उपयोग करने के अपने प्रोजेक्ट में निम्न फ़ाइलों की प्रतिलिपि चाहते हैं:

  • utils\screenboundingrectangle.cs
  • utils\screenrectangle.cs
  • win32\*

तदनुसार नामस्थान अद्यतन करने के लिए + संदर्भ जोड़ने की आवश्यकता हो सकती System.Drawing + System.Windows.Forms

तो फिर तुम निम्न कोड के साथ एक आयत आकर्षित कर सकते हैं:

namespace Something 
{ 
    public class Highlighter 
    { 
     ScreenBoundingRectangle _rectangle = new ScreenBoundingRectangle(); 
     public void DrawRectangle(Rectangle rect) 
     { 
      _rectangle.Color = System.Drawing.Color.Red; 
      _rectangle.Opacity = 0.8; 
      _rectangle.Location = rect; 
      this._rectangle.Visible = true; 
     } 
    } 
} 

और

var rect = Rectangle.FromLTRB(100, 100, 100, 100); 
var hi = new Highlighter(); 
hi.DrawRectangle(rect); 
संबंधित मुद्दे