2010-11-25 16 views
6

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

मैंने एक प्रोटोटाइप बनाया जो किसी रूप में सभी नियंत्रणों के लिए एक क्लिक ईवेंट के लिए एक विधि को जोड़ता है, लेकिन यह सभी रूपों के लिए कैसे किया जा सकता है? घटनाओं में हेरफेर करते समय प्रतिबिंब को लक्षित वस्तु की आवश्यकता होती है, लेकिन केवल स्टार्टअप फॉर्म को आसानी से एक्सेस किया जा सकता है।

क्या किसी ऑब्जेक्ट के निर्माता को हुक करने का कोई तरीका है? फिर मैं नए रूप की सभी घटनाओं में अपनी विधि को "इंजेक्ट" कर सकता था। या शायद ऐसा करने का एक और तरीका है।

अग्रिम धन्यवाद!

उत्तर

7

आप message filter इंस्टॉल कर सकते हैं।

एक संदेश फ़िल्टर एक ऑब्जेक्ट है जो IMessageFilter लागू करता है। WinForms आपके थ्रेड के संदेश लूप से गुज़रने वाले प्रत्येक संदेश के लिए आपकी PreFilterMessage विधि को कॉल करता है। यह एप्लिकेशन में उपयोगकर्ता इनपुट की निगरानी करने के लिए पर्याप्त है (और आपको इसे छेड़छाड़ करने का विकल्प देता है)।

1

विंडोज एपीआई में यह स्थानीय हुक का उपयोग करके किया जाता है (आप SetWindowsHookEx फ़ंक्शन का उपयोग करके स्थानीय माउस हुक सेट कर सकते हैं)। यह आपके काम को करने का सही तरीका है। सी # में आपको SetWindowsHookEx तक पहुंच प्राप्त करने के लिए पी/Invoke का उपयोग करने की आवश्यकता है।

एक और कार्य एचडब्ल्यूएनडी (विंडोज हैंडल) से संबंधित WinForms नियंत्रण से मेल खाना होगा। इसे कैसे करें (WM_GETCONTROLNAME संदेश के माध्यम से) this article पढ़ें।

यह भी देखें this question जो आपके डुप्लिकेट है।

0

आपको message filters - के साथ जो भी आप चाहते हैं उसे हासिल करने में सक्षम होना चाहिए Win32-APIs के लिए कोई प्रत्यक्ष पी/Invoke आवश्यक नहीं है!

अधिक जानकारी के लिए IMessageFilter इंटरफ़ेस पर सहायता देखें।