using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MouseKeyboardStateTest
{
public abstract class Keyboard
{
[Flags]
private enum KeyStates
{
None = 0,
Down = 1,
Toggled = 2
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern short GetKeyState(int keyCode);
private static KeyStates GetKeyState(Keys key)
{
KeyStates state = KeyStates.None;
short retVal = GetKeyState((int)key);
//If the high-order bit is 1, the key is down
//otherwise, it is up.
if ((retVal & 0x8000) == 0x8000)
state |= KeyStates.Down;
//If the low-order bit is 1, the key is toggled.
if ((retVal & 1) == 1)
state |= KeyStates.Toggled;
return state;
}
public static bool IsKeyDown(Keys key)
{
return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
}
public static bool IsKeyToggled(Keys key)
{
return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
}
}
}
11 回答
如果Ctrl Shift关闭,这也将成立 . 如果要检查是否按下Shift,
如果您在继承
Control
的类(例如表单)中,则可以删除Control.
下面的代码是如何检测几乎所有当前按下的键,而不仅仅是Shift键 .
如果引用System.Windows.Input,也可以查看以下内容
Keyboard命名空间也可用于使用Keyboard.IsKeyDown(Key)检查其他键的按下状态,或者如果您订阅了KeyDownEvent或类似事件,则事件参数带有当前按下的键列表 .
这些答案中的大多数要么太复杂,要么似乎不存在 . 然后我发现了一些工作正常的示例代码:http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
如果将来页面消失,我将在下面发布相关的源代码:
从.NET Framework 3.0版开始,可以使用新
System.Windows.Input
命名空间中的Keyboard.IsKeyDown
方法 . 例如:尽管它是WPF的一部分,但该方法适用于WinForm应用程序(假设您添加了对 PresentationCore.dll 和 WindowsBase.dll 的引用) . 不幸的是,
Keyboard.IsKeyDown
方法的3.0和3.5版本不适用于WinForm应用程序 . 因此,如果您确实想在WinForm应用程序中使用它,则需要将.NET Framework 4.0或更高版本作为目标才能使用 .您可以P/Invoke下载到Win32 GetAsyncKeyState来测试键盘上的任何键 .
您可以将Keys enum(例如Keys.Shift)中的值传递给此函数,因此只需要几行代码即可添加它 .
如果上面的代码在窗体的keydown事件中,并且没有其他控件捕获密钥关闭的keydown事件,则对文本框有用 .
还有人可能希望停止进一步的密钥处理:
光标x / y位置是属性,按键(如鼠标单击/鼠标移动)是一个事件 . 最佳做法通常是让界面成为事件驱动 . 关于你唯一需要上述的时间就是你要做一个移动鼠标点击的事情 .
我发现在Windows窗体表单上管理键盘输入的最佳方法是在击键后和聚焦控件接收事件之前处理它 . Microsoft维护一个名为 .KeyPreview 的内置
Form
-level属性,以便于实现这一目标:然后可以封送表单的_KeyDown,_KeyPress和/或_KeyUp事件以在聚焦表单控件看到它们之前访问输入事件,并且可以应用处理程序逻辑来捕获事件或允许它传递到聚焦表单控件 .
虽然不像XAML's事件路由体系结构那样结构优雅,但它使Winforms中的表单级函数管理变得更加简单 . 有关警告,请参阅MSDN notes on KeyPreview .
在WinForms中:
这听起来像Stack Overflow问题Detect Shift key is pressed without using events in Windows Forms?的重复 .