[英]C#: In the keydown event of a textbox, how do you detect currently pressed modifiers + keys?
[英]How to detect if multiple keys are pressed in C# forms
我一直在寻找一种解决方案来检测是否在C#中按下了多个键(我找不到解决方案!)。 我有这个游戏有两个玩家,我需要检测是否按下键来移动他们。 (我正在使用 C# 表单)我只找到了检测是否同时按住两个键并且它们没有帮助的答案。
- 编辑 -
如何使用 KeyPressed (C#) 检测是否按下了某个键
问题的根源在于 Winforms 根本不支持这个简单的请求。
听起来怪怪的? 这是。 Winforms 通常非常接近硬件层,虽然有时这可能很有趣,但它也可能只是一个皮塔......
((应该注意 Hans 的一个隐藏提示:在KeyUp
中,您会被告知释放了哪个键,以便您可以跟踪任意数量的键..))
但是现在对于不需要您保留一堆KeyDown
bools
KeyUp KeyUp
中管理它们的直接解决方案..:输入Keyboard.IsKeyDown 。
有了它,这样的代码可以工作:
使用
Keyboard.IsKeyDown
来确定某个键是否按下。e
是KeyEventArgs
的一个实例。if (Keyboard.IsKeyDown(Key.Return)) { btnIsDown.Background = Brushes.Red; } ...
当然,您也可以检查多个键:
if (Keyboard.IsKeyDown(Key.A) && Keyboard.IsKeyDown(Key.W)) ...
唯一的要求是你从WPF
借用这个:
首先:添加命名空间:
using System.Windows.Input;
然后:在项目中添加两个引用:
PresentationCore
WindowsBase
现在您可以随时测试键盘,包括KeyPress
事件。
也许用于打印到控制台...
if (Input.GetKeyDown(KeyCode.G)) {print ("G key pressed");}
最简单的方法是:
为表单创建 KeyDown 事件
在类中写下下面的 DllImports:
[DllImport("user32")] public static extern int GetAsyncKeyState(int vKey); [DllImport("user32.dll")] public static extern int GetKeyboardState(byte[] keystate);
在 KeyDown 事件中写下以下代码:
byte[] keys = new byte[256]; GetKeyboardState(keys); if ((keys[(int)Keys.ControlKey] & keys[(int)Keys.S] & 128) == 128) // change the keys if you want to { // it worked }
粘贴代码this.KeyPreview = true;
在 Form_Load 事件和繁荣中,你去。
这是目前处理多个 Key 事件的最佳方式,因为它是 WinForms 的一种简单直接的方式。
您可以使用程序级键盘挂钩来实现它。 您可以在 user32.dll 中使用 Win-API 函数,例如SetWindowsHookEx 。
以下是它的一些例子:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.