2010-05-07 12 views
12

मेरे विंडोज़ फॉर्म एप्लिकेशन में मैं इसे दबाए जाने पर हर बार एक परीक्षण चलाने के लिए एक विशेष बटन चाहूंगा। दर्जनों नियंत्रण हैं इसलिए इसे प्रत्येक में लागू करने में बहुत अधिक समय लगता है।हॉटकी (ग्लोबल नहीं) .NET

क्या कोई तरीका है कि मैं हॉटकी सेट कर सकता हूं, इससे कोई फर्क नहीं पड़ता कि मैं एप्लिकेशन में क्या कर रहा हूं, मैं कुंजी दबा सकता हूं, और यह मेरी घटना को बंद कर देगा?

उत्तर

15

आप या तो एक नियंत्रण या एक रूप में ProcessCmdKey ओवरराइड और आपकी हॉटकी संभाल कर सकते हैं,।

MSDN से:

ProcessCmdKey विधि पहले निर्धारित करता है कि नियंत्रण एक ContextMenu है, और यदि हां, तो आदेश कुंजी कार्रवाई करने के लिए ContextMenu सक्षम बनाता है। यदि कमांड कुंजी मेनू शॉर्टकट नहीं है और नियंत्रण में माता-पिता हैं, कुंजी माता-पिता के ProcessCmdKey विधि को पास की जाती है। शुद्ध प्रभाव यह है कि कमांड कुंजियां नियंत्रण पदानुक्रम "बुलबुले" हैं। के अलावा उपयोगकर्ता द्वारा दबाए गए कुंजी, कुंजी डेटा यह भी इंगित करता है कि, यदि कोई है, तो संशोधक कुंजी को कुंजी के साथ दबाया गया था। संशोधक कुंजी में SHIFT, CTRL, और ALT कुंजी शामिल हैं।

उदाहरण के लिए:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    // if it is a hotkey, return true; otherwise, return false 
    switch (keyData) 
    { 
     case Keys.Control | Keys.C: 
      // do something 
      return true; 
     default: 
      break; 
    } 

    return base.ProcessCmdKey(ref msg, keyData); 
} 
1

यदि आपके पास सिर्फ एक ही फॉर्म है। आप Form.KeyPreview = true सेट कर सकते हैं और फिर फ़ॉर्म की मुख्य ईवेंट में कोड जोड़ सकते हैं।

4

आप किसी प्रपत्र की प्रक्रिया CmdKey() विधि को ओवरराइड कर सकते हैं, यह फ़ॉर्म पर किसी भी नियंत्रण से पहले चलता है इससे पहले कुंजी स्ट्रोक दिखाई देगा। यदि आपको वास्तव में एप्लिकेशन स्तर (सभी रूपों) पर होने की आवश्यकता है तो आपको अपना मुख्य फॉर्म 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) { 
     // Catch WM_KEYDOWN message 
     if (m.Msg == 0x100 && (Keys)m.WParam == Keys.F1) { 
      MessageBox.Show("Help me!"); 
      return true; 
     } 
     return false; 
    } 
} 
+0

ProcessCmdKey FTW –

+0

मैं इस एक को स्वीकार चिह्नित है, लेकिन फिर मैंने देखा Zach बारे में 'base.ProcessCmdKey (सन्दर्भ संदेश, keyData) वापसी था,' और मैं एक बेवकूफ की तरह महसूस (मैं ऐसा करने के लिए उपयोग करता हूं लेकिन मैं इस बार iddnt) और मेरे कोड को अद्यतन किया। वह उसे जवाब देने के लिए प्राप्त करता है मुझे मेरी गलती की याद दिलाता है। हालांकि आपके पास अधिक जवाब थे। यह एक कठिन विकल्प था। –