2009-12-04 8 views
6

नोट: e.IsRepeat काम करने की पुष्टि है। समस्या मौजूद है क्योंकि मैं उबंटू से विंडोज तक रिमोट डेस्कटॉप का उपयोग करता हूं।डब्ल्यूपीएफ: कुंजी * घटनाओं में कुंजी पुनरावृत्ति का पता कैसे लगाया जाए?

  1. उबंटू में अक्षम कुंजी पुनरावृत्ति:

    मैं इस दूरस्थ डेस्कटॉप समस्या के लिए एक समाधान मिल गया।

  2. मेजबान विंडोज में: "दोहराएँ कुंजी और धीरे कुंजी चालू करें"
  3. HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
    1. पर्याप्त AutoRepeatDelay, AutoRepeatRate, औरLast Valid Delay, Last Valid Repeat छोटे करने के लिए सेट करने के लिए जाना regedit का उपयोग के साथ FilterKeys सक्षम करें।
    2. फ़िल्टरकेज़ अक्षम करें और रजिस्ट्री परिवर्तनों को रीफ्रेश करने के लिए पुन: सक्षम करें।

कैसे एक KeyUp/KeyDown (या PreviewKeyDown/PreviewKeyUp) की घटनाओं में महत्वपूर्ण पुनरावृत्ति पता लगाता है?

मैं निम्नलिखित है परीक्षण का मामला:

public Window1() { 
     InitializeComponent(); 

     this.KeyDown += new KeyEventHandler(Window1_KeyDown); 
     this.KeyUp += new KeyEventHandler(Window1_KeyUp); 
    } 

    void Window1_KeyUp(object sender, KeyEventArgs e) { 
     if (e.Key == Key.D) { 
      Console.WriteLine("DOWN: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp); 
     } 
    } 

    void Window1_KeyDown(object sender, KeyEventArgs e) { 
     if (e.Key == Key.D) { 
      Console.WriteLine("UP: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp); 
     } 
    } 

यह मेरे आउटपुट स्क्रीन के लिए देता है निम्नलिखित अगर मैं अक्षर D नीचे दबाएँ और कुछ समय के बाद इसे जारी:

// Note: Here I press D-key down. 
UP: key: D, repFalse, toggTrue, dowTrue, upFalse 
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue 
UP: key: D, repFalse, toggFalse, dowTrue, upFalse 
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue 
UP: key: D, repFalse, toggTrue, dowTrue, upFalse 
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue 
UP: key: D, repFalse, toggFalse, dowTrue, upFalse 
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue 
UP: key: D, repFalse, toggTrue, dowTrue, upFalse 
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue 
UP: key: D, repFalse, toggFalse, dowTrue, upFalse 
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue 
UP: key: D, repFalse, toggTrue, dowTrue, upFalse 
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue 
UP: key: D, repFalse, toggFalse, dowTrue, upFalse 
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue 
UP: key: D, repFalse, toggTrue, dowTrue, upFalse 
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue 
UP: key: D, repFalse, toggFalse, dowTrue, upFalse 
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue 
UP: key: D, repFalse, toggTrue, dowTrue, upFalse 
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue 
UP: key: D, repFalse, toggFalse, dowTrue, upFalse 
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue 
// Note: Here I release D-key. 

जाहिर e.IsRepeat है हमेशा झूठा, तो यह बेकार है। मैंने यह भी देखा कि कभी-कभी पहली घटना भी toggFalse, dowTrue है, ताकि पैटर्न के रूप में उपयोग नहीं किया जा सके।

मैं यह भी ध्यान देता हूं कि समय का उपयोग करने का चालाक तरीका पुनरावृत्ति का पता लगाने के लिए उपयोग किया जा सकता है, लेकिन ऐसा करने का मूल तरीका होना चाहिए।

+0

आगे देख रहे हैं: मुझे लगता है कि मैं आपके प्रयोग को दोहराना नहीं कर सकता। क्या टेक्स्टबॉक्स का उपयोग करना है, चाहे कंसोल पर लिखना है, चाहे डीबग या रिलीज़ में हों, चाहे KeyDown या previewKeyDown में यह हमेशा 'IsRepeat' सेट करता है। क्या आपके कोड का कोई हिस्सा नहीं दिखाया गया है? – Abel

+0

हाबिल, नहीं, मैंने इसके लिए खाली परियोजना बनाई है। – Ciantic

+0

आप कहते हैं कि आप दूरस्थ डेस्कटॉप पर हैं। क्या आप इसे बिना कोशिश कर सकते हैं? बहुत संभावना है, आरडी + उबंटू आपको भागों खेल रहे हैं। – Abel

उत्तर

7

मूल संभावनाओं का उपयोग क्यों नहीं करें? मैंने विंडो और दो टेक्स्टबॉक्स पर एक पूर्वावलोकनकेडडाउन ईवेंट जोड़ा। दबाया और दूसरा पाठ बॉक्स में एक महत्वपूर्ण आयोजन किया और इस उत्पादन है:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    textBox1.Text += String.Format(
     "Repeat: {0}, key: {1}\n", 
     e.IsRepeat, 
     e.Key); 
} 

अपडेट:: हटाया मेरे सभी कोड (वहाँ

Repeat: False, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 

इस कोड को मैं प्रयोग किया जाता है अन्य परीक्षणों से कुछ कचरा था) और आपके कोड में चिपकाया गया है। यह मुझे कंसोल में निम्नलिखित आउटपुट देता है, इसलिए मैं इकट्ठा करता हूं कि हमें अन्य कारणों पर एक नज़र रखना चाहिए ...

UP: key: D, repFalse, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
+0

सही घटना क्या है? जैसा कि मैंने कहा था कि अगर मैं घटनाओं को पूर्वावलोकन में बदलता हूं * यह मेरे कंप्यूटर पर ई.आईएसरिपेट सेट करने में विफल रहता है। – Ciantic

+0

अंतर को ध्यान में रखते हुए: कोई नहीं। मैंने कोशिश की कि आपने क्या प्रयास किया (लेकिन इस पोस्ट को लिखने के बाद ही)। मैं सामान्य WPF प्रोजेक्ट के साथ .NET 3.5 SP1 का उपयोग करता हूं। एक विंडो और फिर आपका कोड जोड़ा गया। – Abel

+0

बस टेक्स्टबॉक्स के बिना परीक्षण किया गया। काम करता है। फिर अपने कोड के साथ परीक्षण किया। काम करता है। हम्म ... .NET अद्यतित नहीं है, आपके सिस्टम पर कीलॉगर? – Abel

0

एक चर सेट करें जब कीडाउन ईवेंट ट्रैक करता है कि कौन सी कुंजी दबाई जाती है, तो अपनी चीज (टीएम) करें और फिर उस कुंजी के लिए आगे की घटनाओं को अनदेखा करें। जब keyup तार चर को साफ़ करता है। एकाधिक कुंजी ट्रैक करने के लिए आपको एक सूची की आवश्यकता हो सकती है।

+0

उह, ठीक है, देखें कि कीप को हमेशा * हमेशा * निकाल दिया जाता है, ताकि स्वाभाविक रूप से काम न हो। – Ciantic

+0

लेकिन जिस तरह से आपने वर्णन किया चतुर समय का उपयोग किया जाएगा, लेकिन यह सिर्फ पागल है ... जैसा कि मैंने सवाल में देखा है, एक साथ निकटता कुंजी कुंजी/कुंजीडाउन घटनाओं के साथ कुंजी पुनरावृत्ति का पता लगाने का दूसरा तरीका होना चाहिए। – Ciantic

+0

चालाक समय की आवश्यकता नहीं है, बस उपयोग करें सही घटना में 'IsRepeat', यह सब वहाँ है। – Abel

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