2016-05-23 5 views
5

मैं एक सहायक प्रौद्योगिकी अनुप्रयोग (सी # में) विकसित कर रहा हूं जो वर्तमान में खुली विंडो के शीर्ष पर जानकारी ओवरले करता है। यह क्लिक करने योग्य तत्वों का पता लगाता है, और उन्हें लेबल करता है।.NET/C# में राइट-क्लिक मेनू के शीर्ष पर कैसे आकर्षित करें?

ऐसा करने के लिए, मैं वर्तमान में टॉपमोस्ट सेट के साथ एक सीमाहीन, पारदर्शी विंडो बना रहा हूं, जिसमें "सत्य" सेट है, और उस पर लेबल खींच रहा है। इसका मतलब है कि वर्तमान एप्लिकेशन के सामने हमेशा एक खिड़की हो रही है, जिस पर मैं लेबल खींच सकता हूं।

समस्या यह है कि, इस विंडो में राइट-क्लिक मेनू - केवल अन्य विंडो शामिल नहीं हैं। जब उपयोगकर्ता राइट-क्लिक करता है, तो संदर्भ मेनू ओवरले के ऊपर खींचा जाता है।

मुझे राइट-क्लिक मेनू में तत्वों को लेबल करने में सक्षम होना चाहिए, लेकिन मैं वर्तमान कार्यान्वयन के साथ इसके शीर्ष पर नहीं खींच सकता। क्या किसी को समाधान का पता है?

संपादित करें: यह ओवरले ड्राइंग के लिए प्रासंगिक कोड है। मैंने फॉर्म डिज़ाइनर में फॉर्म डिज़ाइन सेट नहीं किया है, कोड स्पष्टीकरण में नहीं, इसलिए मुझे यकीन नहीं है कि इससे कितना मदद मिलेगी। मैंने ड्राइंग से संबंधित कोड को हटा दिया है, या फॉर्म स्वयं:

public partial class OverlayForm : Form 
{ 
    public OverlayForm() 
    { 

    } 

    protected override void OnPaint(PaintEventArgs eventArgs) 
    { 
     base.OnPaint(eventArgs); 
     Graphics graphics = eventArgs.Graphics; 
     Brush brush = new SolidBrush(this.labelColor); 
     foreach (ClickableElement element in this.elements) 
     { 
      Region currentRegion = element.region; 
      graphics.FillRegion(brush, currentRegion); 
     } 
    }  
} 
+1

क्या आप ओवरले – Jacobr365

+0

@ जैकब्रे 365 - निश्चित बात, जोड़ने के लिए अपना कोड दिखा सकते हैं। :) – JackCC

+0

मुझे नहीं लगता कि यह संभव है। संदर्भ मेनू को आपके फॉर्म की तुलना में और भी "शीर्ष-सबसे अधिक" खींचा जाता है, क्योंकि यह ओएस द्वारा फोकस और उच्च जेड-ऑर्डर प्राप्त करता है। – DonBoitnott

उत्तर

0

मुझे एक हैक समाधान मिला है।

समय-समय पर ओवरले विंडो को सामने लाकर, मैं इसे जेड-ऑर्डर के शीर्ष पर ला सकता हूं जहां यह राइट-क्लिक मेनू को कवर करता है। यह सही नहीं है, लेकिन यह काम करता है। यह मूल अवधारणा है multithreading के साथ बाहर छीन लिया:

public class OverlayManager 
{ 
    OverlayForm overlay; 

    public OverlayManager() 
    { 
     this.overlay = new OverlayForm(); 
     this.overlay.Show(); 
     this.RepeatedlyBringToFront(); 
    } 

    private void RepeatedlyBringToFront() 
    { 
     while (true) 
     { 
      this.overlay.BringToFront(); 
      Thread.Sleep(50); 
     } 
    } 
} 

(यह मान लिया गया है "OverlayForm" प्रासंगिक झंडे प्रपत्र डिजाइनर में सेट के साथ एक रूप है - "हमेशा शीर्ष पर," पारदर्शिता कुंजी यानी "" " सीमाहीन, "" अधिकतम, "आदि)

मैंने केवल विंडोज 8.1 पर इसका परीक्षण किया है। मुझे नहीं पता कि ज़ेड-ऑर्डर अन्य संस्करणों पर इस तरह से व्यवहार करता है या नहीं।

0

अपने फॉर्म में एक संदर्भमेन जोड़ें और फिर इसे ContextMenuStrip के अंतर्गत नियंत्रण गुणों में असाइन करें।

ContextMenu cm = new ContextMenu(); 
cm.MenuItems.Add("Item 1"); 
cm.MenuItems.Add("Item 2"); 

pictureBox1.ContextMenu = cm; 
+0

मुझे किसी भी एप्लिकेशन में किसी भी संदर्भ मेनू को आकर्षित करने में सक्षम होना चाहिए, मुझे डर है - न केवल इस कार्यक्रम। उपकरण सभी प्रोग्रामों को अक्षम उपयोगकर्ताओं के लिए सुलभ बनाने के लिए बढ़ाता है। क्या आप सुझाव दे रहे हैं कि मैं ओवरले विंडो में इस मेनू को कार्यान्वित करता हूं, और इसे प्रतिस्थापन स्ट्रिप्स के साथ भरता हूं जो अंतर्निहित संदर्भ मेनू के समान हैं, लेबल जोड़े गए हैं? – JackCC

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