我怎样才能确定在KeyDown
那个CtrlUp被按下了。
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up)
{
//do stuff
}
}
不能工作,因为永远不会在同一秒内完全按下两个键。你总是先开始Ctrl然后另一个...
您可以像这样检查 KeyEventArgs 的修饰符:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control)
{
//do stuff
}
}
if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
//Do stuff...
}
您可以尝试使用Keyboard
对象来检测IsKeyDown
属性。此外,如果您不希望浏览器快捷方式被覆盖,您可以将Handled
属性设置为 true。但是在覆盖浏览器快捷方式时要小心,因为它可能会导致混淆。
private void Page_KeyDown(object sender, KeyEventArgs e)
{
// If leftCtrl + T is pressed autofill username
if (Keyboard.IsKeyDown(Key.T) && Keyboard.IsKeyDown(Key.LeftCtrl))
{
txtUser.Text = "My AutoFilled UserName";
e.Handled = true;
}
}
在里面KeyEventArgs
有属性Ctrl,显示这些按钮是否被按下。AltShift
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Up && Keyboard.IsKeyDown(Key.LeftCtrl))
{
//do stuff
}
}
仅当您先按 LeftCtrl,然后按“UP”时,此代码才有效。如果顺序不重要,我建议:
if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))&& Keyboard.IsKeyDown(Key.Z))
{
//do stuff
}
在这种情况下,两个 Ctrl 都被考虑在内,并且顺序无关紧要。
您可以使用 ModifierKeys 属性:
if (e.KeyCode == Keys.Up && (ModifierKeys & Keys.Control) == Keys.Control)
{
// CTRL + UP was pressed
}
请注意,ModifierKeys 值可以是值的组合,因此如果您想检测CTRL是否按下SHIFT或ALT键的状态,您将需要执行按位比较,如我上面的示例所示。如果要确保没有按下其他修饰符,则应检查是否相等:
if (e.KeyCode == Keys.Up && ModifierKeys == Keys.Control)
{
// CTRL + UP was pressed
}
if (e.Control && e.Shift && e.KeyCode == Keys.A) {
}
在尝试检测 [Alt][Right] 时,我花了一段时间才找到最终需要的提示。我在这里找到它:https ://social.msdn.microsoft.com/Forums/vstudio/en-US/4355ab9a-9214-4fe1-87ea-b32dfc22946c/issue-with-alt-key-and-key-down-event ?论坛=wpf
Shortcut
在我使用的辅助类中,它归结为这样的东西:
public Shortcut(KeyEventArgs e) : this(e.Key == System.Windows.Input.Key.System ? e.SystemKey : e.Key, Keyboard.Modifiers, false) { }
public Shortcut(Key key, ModifierKeys modifiers, bool createDisplayString)
{
...
}
在“重新映射”原始值(注意e.Key == System.Windows.Input.Key.System ? e.SystemKey : e.Key
部分)之后,可以像往常一样继续进行进一步的处理。
我测试了下面的代码。有用...
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if ((int) e.KeyData == (int) Keys.Control + (int) Keys.Up)
{
MessageBox.Show("Ctrl + Up pressed...");
}
}
这肯定会奏效。小心处理KeyUp
event 而不是keyDown
.
private void mainForm_KeyUp(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
{
//insert here
}
}
对我来说,keyDown
没有用,keyU
p 代替了相同的代码。
我不知道为什么,但似乎是因为keyDown
事件会在你按下任何键后直接发生,即使那是ctrl键,所以如果你按下ctrl+Up你会ctrl在键之前按下键UP,因此事件会在你按下另一个键之前发生, 同样按下第二个键将再次触发事件。
使用KeyUp
中直到松开按键才会触发事件,所以可以按ctrl,再按第二个键,会触发一个事件。
KeyDown 事件将只保存最近按下的键的信息。我已经成功构建了一个字符串,其中包含所有最新的按键连接在一起。
如果单击“Control”的一个键,或者字符串长度超过 10 个字符,我会清除该字符串。
每次检查字符串,然后执行任务后记,可以很好地使用应用程序中的秘密热键功能。
private void ConfigurationManager_KeyDown(object sender, KeyEventArgs e)
{
string currentKey = e.KeyCode.ToString().ToLower();
if ((currentKey == "controlkey") || (hotKeyList.Length > 10))
{
hotKeyList = "";
}
else
{
hotKeyList += currentKey;
}
if ((hotKeyList == "int") && (!adminLogin))
{
hotKeyList = "";
adminLogin = true;
AdminLoginEvn();
}
}
对于上面的功能,我的热键将是“控制(清除字符串)+ i + n + t”来触发我的 AdminLoginEvn 方法。adminLogin 布尔值被合并,所以我只在应用程序打开时运行一次 AdminLoginEvn。
你可以试试我的工作代码:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
if(e.Alt==true){
//do your stuff
}
}
}
我使用此代码是因为我不知道为什么当我使用:
(e.Keycode == Keys>up && e.Alt==true)
没用。
您必须记住按下的键(即在布尔数组中)。并在按下(keydown)时将位置设置为 1,在 up 时将位置设置为 0。
这样您就可以跟踪多个键。我建议只为特殊键做一个数组
所以你可以这样做:
if (e.KeyCode == Keys.Control)
{
keys[0] = true;
}
// could do the same with alt/shift/... - or just rename keys[0] to ctrlPressed
if (keys[0] == true && e.KeyCode == Keys.Up)
doyourstuff