2009-04-02 1 views
14

में एकाधिक कुंजी डाउन कैप्चर करें Windows Forms फ़ॉर्म में काम करते समय मैं सी # में एकाधिक कुंजी डाउन कैप्चर कैसे कर सकता हूं?सी #

मुझे लगता है कि एक ही समय में ऊपर तीर और दायां तीर दोनों नहीं लग रहे हैं।

उत्तर

13

मुझे लगता है कि जब आप GetKeyboardState एपीआई समारोह का उपयोग आप सबसे अच्छा बंद हो जाएगा।

[DllImport ("user32.dll")] 
public static extern int GetKeyboardState(byte[] keystate); 


private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    byte[] keys = new byte[256]; 

    GetKeyboardState (keys); 

    if ((keys[(int)Keys.Up] & keys[(int)Keys.Right] & 128) == 128) 
    { 
     Console.WriteLine ("Up Arrow key and Right Arrow key down."); 
    } 
} 

कुंजीडाउन ईवेंट में, आप बस कीबोर्ड के 'राज्य' के लिए पूछते हैं। GetKeyboardState आपके द्वारा दिए गए बाइट सरणी को पॉप्युलेट करेगा, और इस सरणी में प्रत्येक तत्व कुंजी की स्थिति का प्रतिनिधित्व करता है।

आप प्रत्येक वर्चुअल कुंजी कोड के संख्यात्मक मान का उपयोग करके प्रत्येक कीस्टेट तक पहुंच सकते हैं। जब उस कुंजी के लिए बाइट 12 9 या 128 पर सेट होता है, तो इसका मतलब है कि कुंजी नीचे है (दबाया गया है)। यदि उस कुंजी का मान 1 या 0 है, तो कुंजी ऊपर है (दबाया नहीं गया है)। मान 1 toggled कुंजी स्थिति के लिए है (उदाहरण के लिए, कैप्स लॉक स्थिति)।

विवरण के लिए Microsoft documentation for GetKeyboardState देखें।

1

हम्म, क्या प्रत्येक कुंजी के लिए अलग-अलग ईवेंट हैं?

आप प्रत्येक तीर के लिए चार बूलियन बना सकते हैं। जब इसे दबाया जाता है, तो उस तीर के बूलियन को सत्य पर सेट करें। अगर जारी किया जाता है, तो उस तीर का बुलियन झूठा सेट करें।

फिर आप जांच सकते हैं कि ऊपर और दाएं बूलियन सत्य हैं या फिर अपनी कार्रवाई करें।

14

आप के लिए एक छोटी सी प्रमाण अवधारणा-का-कोड, Form1 संभालने label1 शामिल हैं:

private List<Keys> pressedKeys = new List<Keys>(); 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    pressedKeys.Add(e.KeyCode); 

    printPressedKeys(); 
} 

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    pressedKeys.Remove(e.KeyCode); 

    printPressedKeys(); 
} 

private void printPressedKeys() 
{ 
    label1.Text = string.Empty; 
    foreach (var key in pressedKeys) 
    { 
     label1.Text += key.ToString() + Environment.NewLine; 
    } 
} 
+0

@JamesBarrass दृष्टिकोण के साथ आप कर सकते हैं Ctrl + पत्र एक्स + पत्र Y: http://stackoverflow.com/questions/11157868/कैप्चरिंग-ctrl-multiple-key-downs –

0

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

4

साथ

Keyboard.IsKeyDown(Key.YourKey) 

आप एक से अधिक keydowns संभाल कर सकते हैं।

+1

हाय, क्या आप लाइब्रेरी कीबोर्ड से आने वाले विस्तार से बता सकते हैं? – randfur

+2

System.Windows.Input.KeyBoard – Andreas

+0

WPF के लिए अच्छा फिट। (असेंबली के अनुसार बोलना, यह प्रस्तुति Core.dll से आता है) –

0

एक प्रबंधित लाइब्रेरी MouseKeyHook as nuget है जो आपको एक सुविधा प्रबंधित रैपर प्रदान करती है। Source code on github

शॉर्टकट का पता लगाने के लिए हाल ही में समर्थन, कुंजी संयोजन और अनुक्रम जोड़े गए थे।

Hook.AppEvents().OnCombination(new Dictionary<Combination, Action> 
{ 
    {Combination.FromString("Left"), GoWest}, 
    {Combination.FromString("Left+Up"), GoNorthWest}, 
    {Combination.FromString("Up+Left"), GoNorthWest}, 
    {Combination.FromString("Up"), GoNorth}, 
    {Combination.FromString("Up+Right"), GoNorthEast}, 
    {Combination.FromString("Right+Up"), GoNorthEast}, 
}); 

अधिक जानकारी के लिए देखें:: यहाँ तीर के साथ निपटने के लिए एक के उपयोग का उदाहरण है Detecting Key Combinations and Seuqnces