WPF में संशोधक प्रमुख राज्यों का पता कैसे लगाएं?


151

क्या कुछ वैश्विक निर्माण हैं जिन्हें मैं जब भी उपयोग कर सकता हूं, क्या नियंत्रण, शिफ्ट, Alt बटन नीचे हैं? उदाहरण के लिए MouseDownघटना के अंदर TreeView

यदि हां, तो कैसे?

जवाबों:


257

कक्षा का उपयोग करें KeyboardKeyboard.IsKeyDownअगर आप कंट्रोल, शिफ्ट, ऑल्ट को डाउन कर रहे हैं तो आप इसका उपयोग कर सकते हैं।

शिफ्ट के लिए:

if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }

नियंत्रण के लिए:

if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }

Alt के लिए:

if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }

125

वहाँ भी:

// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{

}

13
ज्यादा बेहतर उपाय। यह आपको एक बार में सभी संशोधक की जांच करने की अनुमति देता है। यदि आप Ctrl + F को हैंडल करना चाहते हैं, तो आप Ctrl + Shift + F को हैंडल नहीं करना चाहेंगे, इसलिए आप (e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)अन्य सभी सामानों के बदले बस चेक कर सकते हैं ...
ygoe

35
ध्यान दें कि ऊपर दिए गए उदाहरणों में तुलना अलग-अलग परिणाम देती है! जैसा कि ModifierKeys enum में Flags विशेषता है, तो आपके पास Enum में मानों का कोई भी संयोजन हो सकता है। यदि आप केवल दबाए जा रहे शिफ्ट कुंजी को पकड़ना चाहते हैं, तो Keyboard.Modifiers == ModifierKeys.Shiftकथन का उपयोग करें । यदि आप शिफ्ट कुंजी को पकड़ना चाहते हैं, लेकिन यह ध्यान नहीं रखते हैं कि यदि अन्य संशोधक एक ही समय में दबाए जाते हैं, तो (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shiftया तो बेहतर हैफ्लैग सिंटैक्स का उपयोग करेंKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
पेट्रीक बी

4
मैं इस पद्धति का उपयोग करके विंडोज़ कुंजी संशोधक को पकड़ नहीं सका। (CTRL ने ठीक काम किया।) मैं पकड़ने की कोशिश कर रहा था WIN+RightArrow
एवेज़

1
@ सेव्स दिलचस्प, के Keyboard.Modifiersरूप में दिखाता हैNone
चक सैवेज

8
    private bool IsShiftKey { get; set; }

    private void OnPreviewKeyDown(object sender, KeyEventArgs e)
    {
        IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;

        if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
        {
           e.Handled = true;
        }
    }

2
कमेंट्री के साथ-साथ कोड के साथ उत्तर बेहतर होते हैं। कृपया कुछ संदर्भ प्रदान करें।
क्रिस

1
प्रॉपर्टी के रूप में इसे जोड़ने का बहुत अच्छा विचार है
रोलरॉल

1
जब मैंने AltKeyDown को Alt + की तलाश में इस्तेमाल किया, तो मुझे e.Key की जगह e.ystemKey का उपयोग करना पड़ा (e.Key का मूल्य alt + दूसरे वर्ण का उपयोग करने के मामले में "सिस्टम" था, मेरे मामले में)
जोश

3

यह है कि मैं इसे कैसे प्रबंधित करता हूं (PreviewKeyDown का उपयोग करके), मान लें कि हम Alt + R की तलाश कर रहे हैं ...

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
       && e.SystemKey == Key.R)
    {
       //do whatever
    }
}

शायद कोई यह स्पष्ट कर सकता है कि मुझे e.SystemKey का उपयोग करना था और न कि e.Key, शायद संशोधक के कारण? लेकिन यह मेरे लिए त्रुटिपूर्ण रूप से काम करता है जब मैं संशोधक + कुंजी खोजता हूं।


0

और साथ ही:

अगर My.Computer.Keyboard.ShiftKeyDown तो ...

My.Computer.Keyboard.CtrlKeyDown

My.Computer.Keyboard.AltKeyDown


0

आंशिक रूप से @Josh से उधार लेना, और कुछ हद तक @Krushik के समान है, और KeyEventArgs.systemKey और KeyEventArgs.Key के बीच अंतर के बारे में एक प्रश्न का उत्तर देना (उत्तर देने के लिए जोश को SystemKey का उपयोग क्यों करना है); जिसमें, संशोधक कुंजी (जैसे कि Alt) के साथ, e.Key Key.System को लौटाता है, और इस प्रकार 'real' कुंजी e.SystemKey के भीतर है।

इसके आसपास एक तरीका है, पहले 'वास्तविक' कुंजी लाना, और फिर अपनी सशर्त करना:

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    // Fetch the real key.
    var key = e.Key == Key.System ? e.SystemKey : e.Key;

    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
        && key == Key.Return)
    {
        // Execute your code.
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.