व्यक्तिगत रूप से मैं कामयाब करने के लिए एक सांत्वना है कि एक ही समय में दोनों इनपुट और outup संभालती ईवेंट हैंडलर्स का प्रयोग करेंगे, क्लास स्क्रीनमैनेजर या जो भी हो, उस वर्ग के अंदर एक शून्य रनप्रोग्राम() mthod जोड़ें, हैंडलर के साथ एक ईवेंट बनाएं और इनपुट कुंजी "कंसोल। रीडकी (बूल) .key" पढ़ने के लिए आवश्यक चर बनाएं।
static Consolekey newKey;
अपने मुख्य कार्यक्रम पर
, अपने वर्ग "whatev आप इसे कहा जाता है", तो थ्रेड, कि उदाहरणों आंतरिक विधि का एक धागा बनाने का एक उदाहरण creat coreThread = नया थ्रेड (प्रतिनिधि() {myinstance.myProgramMrthod() });
थ्रेड ऊपर और चलने तक आपके मुख्य में लूप। जबकि (! थ्रेड। आईएसएलीव);
फिर मुख्य प्रोग्राम लूप बनाएं।
while (true)
{
}
फिर सुरक्षा के लिए, अपने कस्टम थ्रेड में शामिल हों, इसलिए मुख्य प्रोग्राम तब तक जारी नहीं रहेगा जब तक कि कस्टम थ्रेड बंद/डिस्पोजेड न हो जाए।
customThread.Join();
अब आपके पास दो धागे अलग-अलग चल रहे हैं।
अपनी कक्षा में वापस, अपनी घटना हैंडलर विधि के अंदर एक स्विच बनाएं।
switch (newkey)
{
case Consolekey.enter
Console.WriteLine("enter pressed");
break;
ect, ect.
default:
Console.write(newkey); // writes character key that dont match above conditions to the screen.
break;
}
स्टिक एलियोर लॉजिक इनके साथ कि आप कुंजी को कैसे संभालना चाहते हैं। How to use multiple modifier keys in C# कुछ मदद की हो सकती है।
आपके इंस्टेंस की विधि RunProgram() या व्हाटिव के अंदर जिसे आप कॉल करना चुनते हैं, आपके द्वारा किए जाने वाले कोड को करने के बाद, कुंजी परिवर्तन की जांच करने के लिए एक अनंत लूप बनाएं।
while (true)
{
newKey = Console.ReadKey(true).Key;
if (newKey != oldKey)
{
KeyChange.Invoke();
}
}
इस पाश भंडार किसी भी कुंजी दबाया और फिर अगर थेरेस एक नई कुंजी, सही आग अगर घटना को देखने के लिए जाँच करता है।
अब आपके पास जो कुछ दिख रहा है उसका मूल है, एक स्ट्रिंग जो एक नई कुंजी के लिए पूछताछ करता है, जबकि मुख्य लूप जो भी टेक्स्ट प्रदर्शित करना चाहते हैं उसे प्रदर्शित करने के लिए स्वतंत्र है।
इसके साथ दो फिक्स करने योग्य बग जो मैं सोच सकता हूं, स्विच के अंदर एक "डिफ़ॉल्ट" कैप्स या तारों में कंसोल पर प्रिंट करेगा। और दूसरा कंसोल में जोड़ा गया कोई भी पाठ कर्सर बिंदु पर जोड़ा जाता है, इसलिए यह उस पाठ में जोड़ता है जिसमें उपयोगकर्ता के पास इनपुट होता है।
मैं कभी भी ऐसा करूंगा, क्योंकि मैंने इसे अभी बनाया है, आपको कंसोल में टेक्स्ट को कैसे प्रबंधित करना है। फिर एक घटना का उपयोग कर im। मैं पूरे तरीकों और कार्यों का उपयोग कर सकता हूं लेकिन घटनाओं में कार्यक्रम में लचीलापन बढ़ता है, मुझे लगता है।
ठीक है इसलिए हम कंसोल में टेक्स्ट जोड़ने में सक्षम होना चाहते हैं, इसके बिना हम जो इनपुट दर्ज करते हैं उसे परेशान किए बिना। नीचे इनपुट रखना;
एक नया प्रतिनिधि बनाएं जिसमें एक स्ट्रिंग तर्क, शून्य प्रतिनिधि myDelegate (स्ट्रिंग Arg) के साथ हस्ताक्षर है। फिर इस प्रतिनिधि के साथ एक कार्यक्रम बनाएं, इसे नई लाइन, न्यूइनपूट, व्हाटिव को कॉल करें।
ईवेंट हैंडलर एक स्ट्रिंग तर्क लेगा (कंसोल अपडेट टेक्स्ट को दोबारा डालने वाला: जो आप इनपुट इनपुट के ऊपर कंसोल में डालना चाहते हैं) यह उस पाठ को ले जाएगा जो उपयोगकर्ता कंसोल में प्रवेश कर रहा है, उसे स्टोर करें, फिर कंसोल पर पैरामीटर स्ट्रिंग को मुद्रित करें, फिर नीचे दिए गए उपयोगकर्ताओं के इनपुट को प्रिंट करें।
व्यक्तिगत रूप से मैंने विधि के बाहर शीर्ष पर एक स्थिर स्ट्रिंग बनाने का चयन किया है, इसे खाली करने के लिए शुरू किया है, क्योंकि इसका अक्सर उपयोग किया जा रहा है और आप एक नया पहचानकर्ता नहीं बनना चाहते हैं और फिर प्रत्येक बार विधि को चर शुरू करना चाहते हैं कहा जाता है, फिर विधि के अंत में इसका निपटान करें, केवल एक नया फिर से बनाने के लिए, और फिर।
स्ट्रिंग "इनपुट" या जो कुछ भी कॉल करें।
कुंजीपटल ईवेंट हैंडल के डिफ़ॉल्ट क्षेत्र में इनपुट + = newkey जोड़ें।
Consolekey.enter अनुभाग कंसोल लेखन इनपुट में इनपुट = string.empty या string = ""।
ईवेंट हैंडलर में कुछ तर्क जोड़ें।
public void OnInsert(string Argument)
{
Console.CursorTop -= 1;
// moves the cursor to far left so new input overwrites the old.
// if arg string is longer, then print arg string then print input // string.
if (Argument.Length > input.Length)
{
Console.WriteLine(Argument);
Console.WriteLine(input);
}
else
{
// if the users input if longer than the argument text then print
// out the argument text, then print white spaces to overwrite the
// remaining input characters still displayed on screen.
for (int i = 0; i < input.Length;i++)
{
if (i < Argument.Length)
{
Console.Write(Argument[i]);
}
else
{
Console.Write(' ');
}
}
Console.Write(Environment.NewLine);
Console.WriteLine(input);
}
}
hope this helps some of you, its not perfect, a quick put together test that works enough to be built on.
मुझे किसी भी आसान तरीके से पता नहीं है, नहीं।मैंने कुछ भयानक परिपक्व उत्पादों (जीडीबी, विंडबग) को इस से परेशान नहीं किया है, हालांकि वे आम तौर पर स्क्रीन पर असीमित जानकारी को डंप नहीं करते हैं। आप किस प्रकार की बातचीत की तलाश में हैं? क्या आपने यह पता लगाया है कि कंसोल _should_ व्यवहार कैसे करते हैं? –
यह वास्तव में एक जटिल अवधारणा नहीं है, मैं चाहता हूं कि उपयोगकर्ता टेक्स्ट इनपुट करने में सक्षम हो, संकेत अंतिम पंक्ति के बाद हो रहा है। यदि उपयोगकर्ता टाइपिंग करते समय कोई अन्य पंक्ति लिखी जाती है, तो इस पंक्ति के बाद प्रॉम्प्ट को फिर से खींचा जाता है। –