2013-05-06 3 views
13

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

उत्तर

1

मुझे लगता है कि XQueryTree मदद की जा सकती है। इसे रूट विंडो पर निष्पादित करें और बाल खिड़कियों की सूची प्राप्त करें, अपने स्थान ढूंढें और उचित विंडो में माउस/कीबोर्ड का XEvent पास करें।

नोट: आपको सक्रिय/निष्क्रिय विंडो, सक्रिय/निष्क्रिय क्षेत्र विंडो, अन्य विंडो के बच्चे, आकार और अन्य विंडो के x/y स्थान का ख्याल रखना होगा। कोड इस के लिए गन्दा होने जा रहा है।

+0

तो मैं विंडो आईडी के बाद XGetWindowAttributes प्राप्त करने के लिए XQueryTree का उपयोग करूंगा और ओवरलैप की जांच करूँगा, अगर ओवरलैप है तो मैं उस विंडो में माउस इवेंट भेजता हूं? मैं खिड़की पर माउस इवेंट कैसे भेजूं, या पास करूं? – Corey

+1

मैं 100% निश्चित नहीं हूं लेकिन 'XSendEvent' उस के लिए काम करना चाहिए। – bikram990

+1

इस पर भी एक नज़र डालें 'http://stackoverflow.com/questions/14656615/xlib-xsendevent-click-event-do-not-work-inside-of-some-windows-on-ubuntu-12-04 ? rq = 1 'और यह भी' http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html ' – bikram990

2

यदि आप अपनी "वॉटरमार्क" विंडो को कोई इनपुट प्राप्त नहीं करना चाहते हैं, और इसके बजाय इनपुट नीचे विंडो की ओर जाता है, तो मैं implementation behind gtk_widget_input_shape_combine_region देखता हूं। मैंने पहले अपने पूर्ववर्ती gtk_widget_input_shape_combine_mask का उपयोग पॉपअप विंडो के सभी हिस्सों को किसी भी घटना को प्राप्त नहीं करने के लिए किया था।

मैं यहां अपने आराम क्षेत्र से बाहर हूं, लेकिन ऐसा लगता है कि XShapeCombineRectangles प्रासंगिक कॉल है (इस मामले के लिए do_shape_combine_regionshape = ShapeInput से जुड़ा हुआ है)।

+0

के लिए एक नया प्रश्न के रूप में पूछें मैंने इसे एक जीडीके विंडो के साथ करने की कोशिश की, लेकिन यह काम नहीं किया। –

+0

जब मैंने इसे xlib विंडो के लिए आजमाया, तो यह काम करता है (अंतर्निहित विंडो को बंद करने के लिए आप "X" पर क्लिक कर सकते हैं भी आवश्यकता है)। –

0
  1. आप छोटी सी खिड़की प्रबंधक जो XSelectInput का उपयोग कर indow डिफ़ॉल्ट रूट पर सभी घटनाओं सुनेगा को लागू करने की जरूरत है।

  2. फिर fd = कनेक्शनNember (प्रदर्शन) पर मतदान करें।

  3. जब भी आप ईवेंट प्राप्त करते हैं। जांचें कि यह माउस ईवेंट है, तो यह आपको एक्स, वाई देगा। आप विंडो स्टैक को घुमाने के द्वारा सही विंडो पा सकते हैं।

  4. फिर अंतर्निहित विंडो में ईवेंट की रिपोर्ट करने के लिए XGrabPinter का उपयोग करें।

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