当前位置: 首页 > 编程语言 > C#

C#尝试捕获FormShare上的KeyDown事件

时间:2023-04-10 20:38:40 C#

C#尝试捕获窗体上的KeyDown事件我正在创建一个打印到Windows窗体面板上的小游戏。现在我想捕捉keydown事件,看看它是否是一个被按下的方向键,但问题是我似乎无法捕捉到它。让我解释一下,在一个表单上,我有4个按钮和各种其他控件,例如,如果用户按下其中一个按钮(触发游戏事件),则该按钮具有焦点,我无法用箭头捕捉动作键。我尝试了类似privatevoidKeyDown(KeyEventArgse){if(e.KeyCode==Keys.Left){game.MovePlayer(DonutWarsLibrary.GameObjects.Direction.E);游戏.DrawObjects(panel1.CreateGraphics());}elseif(e.KeyCode==Keys.Right){game.MovePlayer(DonutWarsLibrary.GameObjects.Direction.W);游戏.DrawObjects(panel1.CreateGraphics());}elseif(e.KeyCode==Keys.Up){game.MovePlayer(DonutWarsLibrary.GameObjects.Direction.N);游戏.DrawObjects(panel1.CreateGraphics());}elseif(e.KeyCode==Keys.Down){game.MovePlayer(DonutWarsLibrary.GameObjects.Direction.S);游戏.DrawObjects(panel1.CreateGraphics());然后当按下表单键事件时,我使用这个privatevoidMainForm_KeyDown(objectsender,KeyEventArgse){KeyDown(e);我还为Windows按钮和窗体上的各种其他控件添加了keydown,但我没有得到任何响应。我在函数内放置了一个断点以查看它是否被调用,但断点从未触发?有任何想法吗?最理想的方法是触发一个通用的KeyDown事件(无论当前有什么控件具有焦点),然后调用KeyDown方法。覆盖IsInputKey行为您必须覆盖IsInputKey行为以通知您您希望将右箭头键视为InputKey而不是特殊行为键。为此,您必须覆盖每个控件的方法。我建议您创建您赢得的按钮,比方说MyButton下面的类创建一个自定义Button来覆盖IsInputKey方法,因此右箭头键不被视为特殊键。从那里您可以轻松切换到其他箭头键或其他任何东西。publicpartialclassMyButton:Button{protectedoverrideboolIsInputKey(KeyskeyData){if(keyData==Keys.Right){返回真;}else{returnbase.IsInputKey(keyData);在不同的Button或表单本身中处理您的keyDown事件后:尝试在按钮的KeyDown方法中设置这些属性:privatevoidmyButton1_KeyDown(objectsender,KeyEventArgse){e.Handled=true;//做一点事();}–要么-处理表单中的常见行为:(不要在按钮中设置e.Handled=true;)privatevoidForm1_KeyDown(objectsender,KeyEventArgse){//DoSomething();您是否将表单的KeyPreview属性设置为true?这将使表单对关键事件有一个“初步了解”。更新:当Button具有焦点时,让它工作似乎有点棘手。Button控件拦截箭头键并将焦点移动到Tab键顺序中的下一个或上一个控件,这样不会引发KeyDown、KeyUp和KeyPress事件。但是,会引发PreviewKeyDown事件,因此您可以使用:privatevoidForm_KeyDown(objectsender,KeyEventArgse){e.Handled=ProcessKeyDown(e.KeyCode);}//按钮的PreViewKeyDown事件处理程序privatevoidArrowButton_PreviewKeyDown(objectsender,PreviewKeyDownEventArgse){ProcessKeyDown(e.KeyCode);}privateboolProcessKeyDown(KeyskeyCode){switch(keyCode){caseKeys.Up:{//作用于向上箭头returntrue;}caseKeys.Down:{//作用于向下箭头returntrue;}caseKeys.Left:{//作用于左箭头returntrue;}caseKeys.Right:{//作用于右箭头returntrue;}}返回假;尽管如此,焦点还是以一种相当丑陋的方式移动......我相信解决这个问题的最简单方法是重写表单的ProcessCmdKey()方法。这样,无论哪个控件在按下键时获得焦点,您的键处理逻辑都将被执行。除此之外,您甚至可以选择焦点控件在处置后是否获取密钥(返回false)或不获取(返回true)。你的小游戏例子可以改写成这样:以上是C#学习教程:C#试图捕获窗体上KeyDown事件的全部内容。Follow—protectedoverrideboolProcessCmdKey(refMessagemsg,KeyskeyData){if(keyData==Keys.Left){MoveLeft();}绘制游戏();做任何事情();返回真;//为了让活动控件看到按键,返回false}elseif(keyData==Keys.Right){MoveRight();绘制游戏();做任何事情();返回真;//为了让活动控件看到按键,返回false}elseif(keyData==Keys.Up){MoveUp();绘制游戏();做任何事情();返回真;//为了让活动控件看到按键,返回false}elseif(keyData==Keys.Down){MoveDown();();做任何事情();返回真;//为了让活动控件看到按键,返回false}elsereturnbase.ProcessCmdKey(refmsg,keyData);}publicpartialclassForm1:Form{publicForm1(){InitializeComponent();KeyPreview=true;KeyDown+=newKeyEventHandler(Form1_KeyDown);}voidForm1_KeyDown(objectsender,KeyEventArgse){System.Diagnostics.Debug.Write(e.KeyCode);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: