मेरे पास सी # में लिखा गया एक सरल कंसोल ऐप है। मैं तीर कुंजी प्रेस का पता लगाने में सक्षम होना चाहता हूं, इसलिए मैं उपयोगकर्ता को स्टीयर करने की अनुमति दे सकता हूं। मैं कंसोल ऐप के साथ कीडाउन/कीप घटनाओं का पता कैसे लगा सकता हूं?सी # कंसोल ऐप के लिए तीर कुंजी इनपुट
मेरे सभी googling विंडोज़ फॉर्म के बारे में जानकारी के लिए नेतृत्व किया है। मेरे पास एक जीयूआई नहीं है। यह एक कंसोल ऐप है (एक सीरियल पोर्ट पर रोबोट को नियंत्रित करने के लिए)।
मैं इन घटनाओं को संभालने के लिए लिखा काम करता है है, लेकिन मैं कैसे वास्तव में घटनाओं प्राप्त करने के लिए रजिस्टर करने के लिए पता नहीं है:
private void myKeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Left:
...
case Keys.Right:
...
case Keys.Up:
...
}
}
private void myKeyUp(object sender, KeyEventArgs e)
{
... pretty much the same as myKeyDown
}
यह शायद एक बहुत बुनियादी सवाल है, लेकिन मैं काफी सी # करने के लिए नया हूँ , और मुझे पहले इस तरह के इनपुट प्राप्त करने की आवश्यकता नहीं है।
अद्यतन: कई सुझाव दे रहे हैं कि मैं System.Console.ReadKey(true).Key
का उपयोग करता हूं। यह मदद नहीं करेगा। मुझे एक कुंजी को दबाए जाने के पल को जानने की जरूरत है, जब इसे रिलीज़ किया जाता है, तो कई चाबियों को एक साथ दबाया जा सकता है। इसके अलावा, रीडकी एक अवरुद्ध कॉल है - जिसका अर्थ है कि प्रोग्राम रुक जाएगा और दबाए जाने की कुंजी की प्रतीक्षा करेगा।
अद्यतन: ऐसा लगता है कि ऐसा करने का एकमात्र व्यवहार्य तरीका विंडोज फॉर्म का उपयोग करना है। यह कष्टप्रद है, क्योंकि मैं इसे एक हेडलेस सिस्टम पर उपयोग नहीं कर सकता। कुंजीपटल इनपुट प्राप्त करने के लिए एक फॉर्म जीयूआई की आवश्यकता है ... बेवकूफ।
लेकिन वैसे भी, वंशावली के लिए, मेरा समाधान यहां है। मैं अपने .sln में एक नया प्रपत्र प्रोजेक्ट बनाया:
private void Form1_Load(object sender, EventArgs e)
{
try
{
this.KeyDown += new KeyEventHandler(Form1_KeyDown);
this.KeyUp += new KeyEventHandler(Form1_KeyUp);
}
catch (Exception exc)
{
...
}
}
void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
// handle up/down/left/right
case Keys.Up:
case Keys.Left:
case Keys.Right:
case Keys.Down:
default: return; // ignore other keys
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
// undo what was done by KeyDown
}
ध्यान दें कि यदि आप एक कुंजी को दबाए रखें, KeyDown कई बार बुलाया जाएगा, और KeyUp केवल एक बार कहा जाएगा (जब आप इसे जारी)। तो आपको बार-बार कुंजीडाउन कॉल को गहन तरीके से संभालने की आवश्यकता है।
आप रीडकी को एक अलग थ्रेड में कॉल कर सकते हैं, मेरे कताई थ्रेड सुझाव देखें। हालांकि वह कीप/कीडाउन सामग्री को संबोधित नहीं करता है। – Rushyo