2010-04-06 12 views
5

क्या एक विन फॉर्म एप्लिकेशन में सभी क्लिक लॉग करने का कोई तरीका है? मैं क्लिक को अवरुद्ध करना चाहता हूं और कार्रवाई और नियंत्रण के नाम को रिकॉर्ड करना चाहता हूं।विन फॉर्म, सभी क्लिक लॉग करें?

क्या यह संभव है?

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

अद्यतन: मैं एक अनुप्रयोग विस्तृत समाधान की तलाश में हूं, क्या विंडोज इवेंट कतार (या जिसे कभी भी कहा जाता है) में श्रोता जोड़ने का कोई तरीका नहीं है?

+0

फॉर्म क्लास प्राप्त करने वाली एक नई कक्षा बनाएं, फिर डेविड फॉक्स का कोड अपनी नई कक्षा में रखें। उपभोक्ता रूप पर, डिफ़ॉल्ट रूप के बजाय आपकी नई कक्षा से प्राप्त होता है। पब्लिक क्लास फॉर्म 1: मैजिकफॉर्म –

उत्तर

5

आप अपने ऐप के मुख्य रूप IMessageFilter इंटरफ़ेस को लागू होने से ऐसा कर सकते हैं। आप इसे प्राप्त होने वाले विंडो संदेशों को स्क्रीन कर सकते हैं और क्लिक देख सकते हैं।

public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
     this.FormClosed += (o, e) => Application.RemoveMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x201 || m.Msg == 0x203) { // Trap left click + double-click 
     string name = "Unknown"; 
     Control ctl = Control.FromHandle(m.HWnd); 
     if (ctl != null) name = ctl.Name; 
     Point pos = new Point(m.LParam.ToInt32()); 
     Console.WriteLine("Click {0} at {1}", name, pos); 
     } 
     return false; 
    } 
    } 

ध्यान दें कि यह अपने अनुप्रयोग के किसी भी विंडो में सभी क्लिक्स लॉग: उदाहरण के लिए।

+0

बिल्कुल सही! धन्यवाद। मैंने एप्लीकेशन देखा था। AddMessageFilter लेकिन किसी को नहीं पता था कि एक हैंडल से नियंत्रण कैसे प्राप्त करें। – chillitom

0

ठीक है, आप फॉर्म पर हर नियंत्रण के Click या MouseDown की सदस्यता ले सकते हैं।

इस तरह
+0

जाहिर है, लेकिन मैं ऐसा कुछ ढूंढ रहा हूं जो क्रॉस कटिंग चिंता के रूप में इसका ख्याल रखता है। एक बड़े आवेदन में यह दृष्टिकोण सिर्फ व्यवहार्य नहीं है। – chillitom

0

उपयोग MouseEventArgs:

private void Form_MouseDown(object sender, System.WinForms.MouseEventArgs e) 
{ 
switch (e.Button) 
{ 
    case MouseButtons.Left: 
    MessageBox.Show(this,"Left Button Click"); 
    break; 
    case MouseButtons.Right: 
    MessageBox.Show(this,"Right Button Click"); 
    break; 
    case MouseButtons.Middle: 
    break; 
    default: 
    break; 
} 

EventLog.WriteEntry("source", e.X.ToString() + " " + e.Y.ToString()); //or your own Log function 

} 
1

आप Spy++ या WinSpy++ इस लक्ष्य को हासिल करने के लिए इस्तेमाल कर सकते हैं।

alt text http://www.catch22.net/sites/default/files/images/winspy1.img_assist_custom.jpg

लेकिन मुझे यकीन है कि कैसे आप एक ही बात अपने आप को प्राप्त कर सकते हैं नहीं कर रहा हूँ। यदि यह संभव है तो आपको इसे निम्न-स्तरीय विंडोज एपीआई हुक या एक संदेश हैंडलर के माध्यम से करना होगा जो आपको अपने अनुप्रयोग कतार में सभी संदेशों तक पहुंच प्रदान करता है।

0

नुनिटफॉर्म परीक्षण प्रोजेक्ट में एक रिकॉर्डर एप्लिकेशन है जो इस और कई अन्य घटनाओं के लिए देखता है। कोड बहुत चालाक है और एक अच्छी लग रही है। यह एक थॉटवर्क्स परियोजना है।

हालांकि! रोल्स रॉयस समाधान है कि ...

रिकर्सिवली फार्म और प्रकार के आधार पर घटना के लिए Subscibe का नियंत्रण संग्रह चलने की कोशिश करें।

पी :-)

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