在Windows Forms中,借助Cursors类,您可以随时知道光标的当前位置。
键盘似乎没有相同的功能。是否可以知道是否Shift按下了键?
跟踪每个键盘通知(KeyDown和KeyUp事件)是否绝对必要?
在Windows Forms中,借助Cursors类,您可以随时知道光标的当前位置。
键盘似乎没有相同的功能。是否可以知道是否Shift按下了键?
跟踪每个键盘通知(KeyDown和KeyUp事件)是否绝对必要?
Answers:
if ((Control.ModifierKeys & Keys.Shift) != 0)
如果Ctrl+ Shift向下,这也将成立。如果要检查是否仅按下Shift键,
if (Control.ModifierKeys == Keys.Shift)
如果您使用的是继承的类Control
(例如表单),则可以删除Control.
GetKeyState
API函数。
Keyboard.Modifiers == ModifierKeys.Shift
(对于那些在此处进行搜索的解决方案)
(Control.ModifierKeys & Keys.Shift) != 0
一个人可以使用Control.ModifierKeys.HasFlag(Keys.Shift)
下面的代码是如何检测几乎所有当前按下的键,而不仅仅是Shift键。
private KeyMessageFilter m_filter = new KeyMessageFilter();
private void Form1_Load(object sender, EventArgs e)
{
Application.AddMessageFilter(m_filter);
}
public class KeyMessageFilter : IMessageFilter
{
private const int WM_KEYDOWN = 0x0100;
private const int WM_KEYUP = 0x0101;
private bool m_keyPressed = false;
private Dictionary<Keys, bool> m_keyTable = new Dictionary<Keys, bool>();
public Dictionary<Keys, bool> KeyTable
{
get { return m_keyTable; }
private set { m_keyTable = value; }
}
public bool IsKeyPressed()
{
return m_keyPressed;
}
public bool IsKeyPressed(Keys k)
{
bool pressed = false;
if (KeyTable.TryGetValue(k, out pressed))
{
return pressed;
}
return false;
}
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
KeyTable[(Keys)m.WParam] = true;
m_keyPressed = true;
}
if (m.Msg == WM_KEYUP)
{
KeyTable[(Keys)m.WParam] = false;
m_keyPressed = false;
}
return false;
}
}
GetKeyState
会更有效率。Windows已经为您完成所有键的跟踪时,没有任何意义。
如果引用System.Windows.Input,也可以查看以下内容
if (Keyboard.Modifiers == ModifierKeys.Shift)
Keyboard命名空间还可以用于通过Keyboard.IsKeyDown(Key)检查其他键的按下状态,或者,如果您正在订阅KeyDownEvent或类似事件,则事件参数将携带当前按下的键的列表。
这些答案大多数要么太复杂,要么对我似乎不起作用(例如System.Windows.Input似乎不存在)。然后我发现了一些可以正常工作的示例代码:http : //www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
万一将来页面消失,我将在下面发布相关的源代码:
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);
}
}
}
System.Windows.Input
存在 对于其他为此苦苦挣扎的人,您需要添加对的引用PresentationCore
,以及对WindowsBase
进行System.Windows.Input.Key
枚举的附加引用。始终可以在MSDN上找到此信息。
static
,不是abstract
。
从.NET Framework 3.0版开始,可以使用Keyboard.IsKeyDown
新System.Windows.Input
名称空间中的方法。例如:
if (((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) && Keyboard.IsKeyDown(Key.F))
{
// CTRL + F is currently pressed
}
即使它是WPF的一部分,该方法也适用于WinForm应用程序(前提是您添加了对PresentationCore.dll和WindowsBase.dll的引用)。但是,不幸的是,该Keyboard.IsKeyDown
方法的3.0和3.5版本不适用于WinForm应用程序。因此,如果您确实想在WinForm应用程序中使用它,则需要以.NET Framework 4.0或更高版本为目标才能使其正常运行。
Keyboard.IsKeyDown
方法即使在WinForm项目中也有效。
您可以P / Invoke到Win32 GetAsyncKeyState来测试键盘上的任何键。
您可以将值从Keys枚举(例如Keys.Shift)传递给此函数,因此只需要几行代码即可添加它。
Keyboard
未被编译器识别,但GetAsyncKeystate
在user32中工作正常。谢谢!
我发现在Windows Forms窗体上管理键盘输入的最佳方法是在击键之后且焦点控件接收到该事件之前对其进行处理。Microsoft维护一个Form
名为.KeyPreview的内置级别的属性,以简化此操作:
public frmForm()
{
// ...
frmForm.KeyPreview = true;
// ...
}
然后,可以将表单的_KeyDown,_KeyPress和/或_KeyUp事件编组为访问输入事件,以使焦点表单控件看不到它们,并且您可以应用处理程序逻辑以在那里捕获事件,或允许事件传递给焦点表单控件。
尽管在结构上不如XAML的事件路由体系结构优美,但它使Winforms中的表单级功能的管理更加简单。请注意有关KeyPreview的MSDN注释。
if (Control.ModifierKeys == Keys.Shift)
//Shift is pressed
光标的x / y位置是一个属性,而按键(如鼠标单击/移动)是一个事件。最佳实践通常是让接口受事件驱动。大约只有在您需要执行上述操作时,才可以尝试执行shift +鼠标单击操作。