2012-07-31 14 views
5

मेरे पास अब क्या है: सी # में मेरा ऐप आधा पारदर्शी है, और Winapi ईवेंट नहीं पकड़ता है - प्रत्येक क्लिक, ड्रैग इत्यादि अंडरलेइंग विंडो द्वारा पकड़ लिया जाता है, जो अलग ऐप (वेबब्रॉवर की तरह) है। मैं ब्राउजर शो के शीर्ष पर ओवरले जानकारी के लिए इसका उपयोग करता हूं।अगली winapi घटनाओं को दूसरी विंडो में

int exstyle = GetWindowLong(this.Handle, GWL_EXSTYLE); 
exstyle |= WS_EX_TRANSPARENT; 
SetWindowLong(this.Handle, GWL_EXSTYLE, exstyle); 

IntPtr hwndf = this.Handle; 
IntPtr hwndParent = GetDesktopWindow(); 
SetParent(hwndf, hwndParent); 

लेकिन अब, मैं दोनों मेरे एप्लिकेशन विंडो (जो शीर्ष पर आधा पारदर्शी है) और वेब ब्राउज़र (मेरे ऐप से कम) के लिए सभी घटनाओं भेजना चाहते हैं: यह इस के लिए मेरे कोड है। तो उदाहरण के लिए यदि मैं क्लिक करता हूं, तो क्लिक दोनों विंडोज़ में काम करता है जैसे कि वे शीर्ष पर थे। मुझे कल्पना है कि ऐसा करने का एकमात्र तरीका सभी घटनाओं को पकड़ना है और फिर उन्हें खिड़की को कम करने के लिए अग्रेषित करना है, लेकिन क्या ऐसा करने का कोई तरीका है? मैं Winforms का उपयोग विंडो lib के रूप में करता हूं।


क्या मैं अब क्या है कि महत्वपूर्ण है क्योंकि मैं सामान्य रूप से, घटनाओं का उपभोग करने के फिर उन्हें अंतर्निहित खिड़की को अग्रेषित चाहते नहीं है,। तो यह अब मैं WS_EX_TRANSPARENT के साथ क्या कर रहा हूं उससे कुछ अलग है। इसका मुद्दा एक साथ दोनों खिड़कियों में सामग्री खींचना है। अगर ऐसा करने का कोई बेहतर तरीका है, तो मुझे यह सुनकर खुशी होगी।


कम से कम के रूप में मैं क्या जरूरत है दोनों खिड़कियों के लिए ड्रैग घटनाओं हस्तांतरण करने के लिए है, और अन्य सभी घटनाओं underlaying खिड़की करने के लिए नहीं है (मेरे नियंत्रण के तहत)। तो, शायद मेरी खिड़की के साथ WS_EX_TRANSPARENT (घटनाओं को अंडरलेइंग विंडो के माध्यम से पास करता है) के साथ रहना आसान होगा और ड्रैग ईवेंट प्राप्त करने के लिए बस वैश्विक हुक इंस्टॉल करें? तुम क्या सोचते हो?

बीटीडब्ल्यू मुझे Winapi के साथ अनुभव नहीं है, इसलिए समाधान स्पष्ट हो सकता है।

+0

मैं डॉन ' टी समझ में नहीं आता कि आपको घटनाएं क्यों नहीं मिल रही हैं ... क्या आप एक वास्तविक विंडो बना रहे हैं (आपको चाहिए)? या बस सीधे स्क्रीन पर ड्राइंग (आपको नहीं करना चाहिए!)? – tenfour

+0

@tenfour 'WS_EX_TRANSPARENT' शैली सेट करके। – Neil

+0

@tenfour हाँ, मैं .NET Winform द्वारा बनाई गई विंडो का उपयोग करता हूं, और ड्राइंग Winform द्वारा संभाला जाता है, इसलिए यह विंडो बनाई गई है। मैं केवल एक शैली WS_EX_TRANSPARENT सेट करता हूं और विंडो पैरेंट को डेस्कटॉप के रूप में सेट करता हूं, जो घटना को अंडरलेइंग विंडो में पास करता है, जैसे: http://www.codeproject.com/Articles/12877/ ट्रांसस्पेरेंट- क्लिक करें- थ्रोम्स और हां, यह संदेश विंडो में नहीं आता है, जब तक खिड़की सीधे डेस्कटॉप का बच्चा हो। – Deadeye

उत्तर

0

आप Windows घटनाओं पर कब्जा कर सकते हैं, या वैकल्पिक रूप user32!GetMessage

बुला आप user32!PostMessage या user32!SendMessage API (read PostMessage function on msdn) के माध्यम से अन्य Windows रूपों के लिए संदेश भेज सकते हैं द्वारा फार्म पर WndProc अधिक भार से अपने खुद के रूप में भेज दिया।

0

अंतर्निहित फ़ॉर्म को संभालने के बाद आप ईवेंट को अग्रेषित करने का प्रयास कर सकते हैं। जैसे

protected override void OnDragOver(DragEventArgs drgevent) 
{ 
    base.OnDragOver(drgevent); 
    MyControl.ForwardDragEvent(drgevent); 
} 

myControl में कुछ:

public void ForwardDragEvent(DragEventArgs drgevent) 
{ 
    base.OnDragOver(drgevent); 
    //Or call your own method to handle the event 
} 

मैं इस हालांकि, नियंत्रण का केवल एक ही घटना को संभाला का इस्तेमाल किया है अग्रेषित करने के लिए स्क्रॉल-घटनाओं, मेरे मामले में ..

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