问题描述
问题如题。其中的“即时”是说程序可以检测并判断用户所有的键盘按键。在这先谢过各位的解答。如果我的解释不够清晰的话,那么您可以看一下下面这个例子:有这样一个简单的题目:从键盘输入一串字符,编写程序,去掉其中重复的字符(保留重复字符的第一个),然后将结果显示在屏幕中。这个题目的基本要求实现之后,我想让用户可以重复进行这一操作:输入一个字符串,然后输出处理后的字符串;然后继续输入……而不需要再次运行程序。那么可以把用户输入、处理方法和输出的代码放到一个循环中,循环的条件是某个键盘按键……但这种解决方法的局限是,用户决定是否继续的决定权是受限制的,即用户必须在输入、处理和输出这三个步骤结束之后才能决定是否继续。下面给出代码,可能会便于说明:1classProgram2{3staticvoidMain(string[]args)4{5stringstrInput=string.Empty;67do8{9Console.WriteLine("nPleaseinputastring:");10strInput=Console.ReadLine();11strInput=RemoveRepeatedLetter(strInput);12Console.WriteLine("resultstring:n"+strInput);13}while(ContinueOrNot());14}15publicstaticstringRemoveRepeatedLetter(stringstrOriginal)16{17stringstrResult=string.Empty;1819foreach(charcinstrOriginal)20{21if(!strResult.Contains(c.ToString()))22{23strResult+=c.ToString();24}25}2627returnstrResult;28}29publicstaticboolContinueOrNot()30{31ConsoleKeyc=ConsoleKey.Escape;3233Console.Write("Continue,Y/N?");34c=Console.ReadKey(false).Key;35if(c.CompareTo(ConsoleKey.N)==0)36{37returnfalse;38}39else40{41returntrue;42}43}44}而与本文题目对应的,我真正想要实现的是用户可以随时结束,比如在输入字符串的过程中——例如,上述代码中的循环条件是“按键不是n/N”——当用户按下n/N键之后,程序立即结束运行。请问怎么办呢?可不可以注册事件进行捕获
解决方案
解决方案二:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){stringoutput="";charinput='';while(true){input=Console.ReadKey().KeyChar;if(input=='q'||input=='Q')break;if((int)input==8&&output.Length>0)output=output.Substring(0,output.Length-1);elseif((int)input==13){output=newstring(output.GroupBy(x=>x.ToString().ToLower()).Select(x=>x.First()).ToArray());}elseoutput+=input;Console.Clear();Console.Write(output);}}}}
解决方案三:
你可以创建一个winform不显示,捕获keydown事件。也可以用下面这个方法:(声明:网上拷贝的)必须使用Windowsapi,用键盘钩子函数截取键盘按键记录,然后把这个EXE程序注册为系统服务就能自动运行了,C#中键盘钩子的使用publicclassWin32Hook{[DllImport("kernel32")]publicstaticexternintGetCurrentThreadId();[DllImport("user32",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternintSetWindowsHookEx(HookTypeidHook,HOOKPROClpfn,inthmod,intdwThreadId);publicenumHookType{WH_KEYBOARD=2}publicdelegateintHOOKPROC(intnCode,intwParam,intlParam);publicvoidSetHook(){//setthekeyboardhookSetWindowsHookEx(HookType.WH_KEYBOARD,newHOOKPROC(this.MyKeyboardProc),0,GetCurrentThreadId());}publicintMyKeyboardProc(intnCode,intwParam,intlParam){//在这里放置你的处理代码return0;}}使用方法可以在Form的构造函数里放入Win32Hookhook=newWin32Hook();hook.SetHook();