2009-05-01 12 views
60

क्या कुछ नमूना कोड होगा कि करेंगे जाल Ctrl +टैब और Ctrl +शिफ्ट + टैब एक WPF आवेदन के लिए?WPF में Ctrl + Tab और Ctrl + Shift + Tab कैप्चर कैसे करें?

हमने KeyDown ईवेंट बनाए हैं और इनपुट जेस्चर के साथ कमांड बाइंडिंग जोड़ने का भी प्रयास किया है, लेकिन हम इन दो शॉर्टकट को फँसाने में कभी सक्षम नहीं थे।

उत्तर

91

आपके पास क्या कुंजीडाउन हैंडलर था? नीचे दिया गया कोड मेरे लिए काम करता है। एक है कि मुझे परेशानी देता है: Alt + टैब, लेकिन आप उस के लिए नहीं पूछा: डी

public Window1() 
{ 
    InitializeComponent(); 
    AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent); 
} 

private void HandleKeyDownEvent(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)) 
    { 
     MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
    } 

    if (e.Key == Key.Tab && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
    { 
     MessageBox.Show("CTRL + TAB trapped"); 
    } 
} 
+0

Siz, धन्यवाद में जोड़ा जा सकता है ... हमारे WPF के लिए काम करता है कि। हमारे पास एक एक्सबीएपी भी है जिसे हमें इस पर फंसाने की जरूरत है और यह एक्सबीएपी पर काम नहीं कर रहा है। एक्सबीएपी के साथ ऐसा करने के बारे में कोई विचार भी? – FarrEver

+1

क्या ऐसा करने का कोई शानदार तरीका है? – Shimmy

+13

@siz आप निम्न वाक्यविन्यास का उपयोग कर अपने अगर कथन साफ़ कर सकते हैं: 'कीबोर्ड। मोडिफायर। हैसफ्लैग (संशोधक के। नियंत्रण) ' – Pakman

8

आप KeyUp घटना, नहीं KeyDown उपयोग करने के लिए है ...

+2

दिलचस्प के लिए काम नहीं करता है। कोशिश नहीं की है, लेकिन क्या आप कृपया बता सकते हैं क्यों? –

+7

निश्चित Siz। जब आप एक ही समय में 2 या अधिक कुंजी स्ट्रोक कैप्चर करने का प्रयास कर रहे हैं तो आप e.Key के लिए KeyDown जांच का उपयोग नहीं कर सकते क्योंकि यह एक समय में एक कुंजी को कैप्चर करता है। यदि KeyDown आवश्यक है, उदाहरण के लिए जब उपयोगकर्ता एक महत्वपूर्ण संयोजन दबा रहा है, तो आपको कुंजीडाउन और कीबोर्ड क्लास, विशेष रूप से IsKeyDown() का उपयोग करना चाहिए, विशिष्ट कुंजी के लिए परीक्षण करना चाहिए। –

+1

क्षमा करें, मुझे समझ में नहीं आता कि आप यहां क्या कहने की कोशिश कर रहे हैं। कीप इवेंट भी ई.के में केवल एक ही कुंजी मान पास करता है। क्या आप एक विशिष्ट उदाहरण दे सकते हैं जहां KeyDown के बजाय कीप को संभालना बेहतर होगा "एक ही समय में 2 या अधिक कीस्ट्रोक कैप्चर करना" के लिए बेहतर होगा? धन्यवाद। –

30

गुस्तावो का जवाब वही था जो मैं ढूंढ रहा था।

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    if ((e.Key == Key.V || e.Key == Key.X || e.Key == Key.C) && Keyboard.IsKeyDown(Key.LeftCtrl)) 
     return; 
} 
+0

अफसोस की बात यह है कि जब उपयोगकर्ता सही ctrl बटन का उपयोग करता है तो यह संभाल नहीं पाएगा :-) –

1

हाय आप keydown घटना पर इसका उपयोग कर सकते

private void OnButtonKeyDown(object sender, KeyEventArgs e) 
    { 
     if(Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.Tab) && Keyboard.IsKeyDown(Key.LeftShift)) 
     { 
      // 
      // TODO: somthing here 
      // 
     } 
    } 
+0

यहां समस्या यह भी है कि यदि मैं कथन के साथ एक और जोड़ता हूं (कीबोर्ड.इस्केडाउन (Key.LeftCtrl) और कीबोर्ड। IKeyDown (Key.Tab))। यदि मैं इस मामले में Ctrl + Shift + Tab – Devid

+0

दबाता हूं तो दोनों कथन निष्पादित किए जाएंगे, आप रद्द = सत्य सेट कर सकते हैं; दोनों कथन में Ctrl + Shift + Tab दबाएं – luka

1

कार्य ज़ीमॉन Rozga जवाब का संस्करण (माफ करना, मैं टिप्पणी नहीं कर सकता: हम चिपकाने की अनुमति देने के इनपुट कुंजियों को मान्य, लेकिन अभी भी करना चाहते हैं)। हम ऑल्ट पर देखने के लिए नहीं है, लेकिन यह लेखांकन है बस पहले अगर

public View() 
    { 
    InitializeComponent(); 
    AddHandler(Keyboard.PreviewKeyDownEvent, (KeyEventHandler)controlKeyDownEvent); 
    } 

    private void controlKeyDownEvent(object sender, KeyEventArgs e) 
    { 
    if (e.Key == Key.Tab && Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) 
    { 
     if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) 
      MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
     else 
      MessageBox.Show("CTRL + TAB trapped"); 
    } 
    } 
संबंधित मुद्दे