2008-08-07 17 views
19

मैं सी # के लिए नया हूं और मौजूदा एप्लिकेशन में कुछ काम कर रहा हूं। मेरे पास एक डायरेक्टएक्स व्यूपोर्ट है जिसमें इसमें घटक हैं जो मैं तीर कुंजियों का उपयोग करके स्थिति में सक्षम होना चाहता हूं।सी # और तीर कुंजी

वर्तमान में मैं ProcessCmdKey को ओवरराइड कर रहा हूं और तीर इनपुट को पकड़ रहा हूं और ऑनकेप्रेस ईवेंट भेज सकता हूं। यह काम करता है, लेकिन मैं संशोधक का उपयोग करने में सक्षम होना चाहते (एएलटी + CTRL + शिफ्ट)। जैसे ही मैं एक संशोधक धारण कर रहा हूं और एक तीर दबाता हूं, कोई ईवेंट ट्रिगर नहीं होता है कि मैं सुन रहा हूं।

क्या किसी के पास कोई विचार या सुझाव है कि मुझे इसके साथ कहां जाना चाहिए?

उत्तर

10

आपके ओवरराइड प्रोसेस CmdKey के भीतर आप यह निर्धारित कर रहे हैं कि कौन सी कुंजी दबाई गई है?

कीटाटा (दूसरा पैरामीटर) का मान कुंजी दबाए गए और किसी भी संशोधक कुंजी पर निर्भर करेगा, उदाहरण के लिए, बाएं तीर को दबाकर कोड 37 वापस कर दिया जाएगा, शिफ्ट-बाएं 65573 वापस आएगा, ctrl-left 131109 और alt-बाएँ 262181.

आप संशोधक और चाबी उचित enum मूल्यों के साथ Anding द्वारा दबाया निकाल सकते हैं:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    bool shiftPressed = (keyData & Keys.Shift) != 0; 
    Keys unmodifiedKey = (keyData & Keys.KeyCode); 

    // rest of code goes here 
} 
6

मैं Tokabi's answer upvoted, लेकिन कुंजी की तुलना के लिए StackOverflow.com here पर कुछ अतिरिक्त सलाह है। यहां कुछ फ़ंक्शन हैं जिनका उपयोग मैंने सब कुछ सरल बनाने में मदद के लिए किया था।

public Keys UnmodifiedKey(Keys key) 
    { 
     return key & Keys.KeyCode; 
    } 

    public bool KeyPressed(Keys key, Keys test) 
    { 
     return UnmodifiedKey(key) == test; 
    } 

    public bool ModifierKeyPressed(Keys key, Keys test) 
    { 
     return (key & test) == test; 
    } 

    public bool ControlPressed(Keys key) 
    { 
     return ModifierKeyPressed(key, Keys.Control); 
    } 

    public bool AltPressed(Keys key) 
    { 
     return ModifierKeyPressed(key, Keys.Alt); 
    } 

    public bool ShiftPressed(Keys key) 
    { 
     return ModifierKeyPressed(key, Keys.Shift); 
    } 

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (KeyPressed(keyData, Keys.Left) && AltPressed(keyData)) 
     { 
      int n = code.Text.IndexOfPrev('<', code.SelectionStart); 
      if (n < 0) return false; 
      if (ShiftPressed(keyData)) 
      { 
       code.ExpandSelectionLeftTo(n); 
      } 
      else 
      { 
       code.SelectionStart = n; 
       code.SelectionLength = 0; 
      } 
      return true; 
     } 
     else if (KeyPressed(keyData, Keys.Right) && AltPressed(keyData)) 
     { 
      if (ShiftPressed(keyData)) 
      { 
       int n = code.Text.IndexOf('>', code.SelectionEnd() + 1); 
       if (n < 0) return false; 
       code.ExpandSelectionRightTo(n + 1); 
      } 
      else 
      { 
       int n = code.Text.IndexOf('<', code.SelectionStart + 1); 
       if (n < 0) return false; 
       code.SelectionStart = n; 
       code.SelectionLength = 0; 
      } 
      return true; 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

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

  • कोई संबंधित समस्या नहीं^_^