सी # और तीर कुंजी

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

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

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

0
ro fr bn

2 उत्तर

मैंने टोकबी का उत्तर अपनाना है, लेकिन कुंजी की तुलना करने के लिए कुछ अतिरिक्त सलाह है < a href = "https://stackoverflow.com/questions/1369312/c-keys-enumeration-confused-keys-alt-or-keys-rbutton-keys-shiftkey-keys-alt/2033796#2033796"> StackOverflow.com यहाँ । यहां कुछ फ़ंक्शन हैं जिनका उपयोग मैंने सब कुछ सरल बनाने में मदद के लिए किया था।

   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);
    }
0
जोड़ा

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

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

आप उपयुक्त enum मानों के साथ एंडिंग द्वारा संशोधित संशोधक और कुंजी निकालें:

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
}
0
जोड़ा