C# KeyDown:识别多个关键点
如何在C# KeyDown:识别多个关键点,c#,keydown,ctrl,C#,Keydown,Ctrl,如何在向下键中确定按下了CtrlUp private void listView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up) { //do stuff } } 无法工作,因为两个键从未在同一秒钟内完全按下。你总是先按Ctrl键,然后按另一个键 你必须记住按下的键(如在布尔数组中)。按
向下键中确定按下了CtrlUp
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up)
{
//do stuff
}
}
无法工作,因为两个键从未在同一秒钟内完全按下。你总是先按Ctrl键,然后按另一个键 你必须记住按下的键(如在布尔数组中)。按下(向下键)时将位置设置为1,向上键时将位置设置为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
您可以检查KeyEventArgs的修饰符,如下所示:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control)
{
//do stuff
}
}
来自:
在KeyEventArgs
中有属性Ctrl、Alt和Shift,显示是否按下了这些按钮。您可以使用ModifierKeys属性:
if (e.KeyCode == Keys.Up && (ModifierKeys & Keys.Control) == Keys.Control)
{
// CTRL + UP was pressed
}
请注意,ModifierKeys值可以是多个值的组合,因此,如果要检测到无论SHIFT键或ALT键的状态如何,都按了CTRL键,则需要像上面的示例中那样执行逐位比较。如果要确保未按下其他修改器,则应检查是否相等:
if (e.KeyCode == Keys.Up && ModifierKeys == Keys.Control)
{
// CTRL + UP was pressed
}
您可以尝试使用键盘
对象检测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;
}
}
这肯定会奏效。小心处理KeyUp
事件,不要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键,因此事件将在您按下另一个键之前发生,同时按下第二个键将再次触发事件
使用KeyUp时,
在释放键之前不会触发事件,因此您可以按ctrl键,然后按第二个键,这将触发一个事件。您可以尝试我的工作代码:
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)
不起作用。
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和Ctrl都被考虑在内,对于顺序没有任何重要性。我在下面的代码中进行了测试。它是有效的
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if ((int) e.KeyData == (int) Keys.Control + (int) Keys.Up)
{
MessageBox.Show("Ctrl + Up pressed...");
}
}
我花了一段时间才找到在尝试检测[Alt][Right]时最终需要的提示。我在这里找到的:
它可以归结为我使用的快捷方式助手类中的类似内容:
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
部分)后,可以像往常一样继续进行进一步的处理。if(e.Control&&e.Shift&&e.KeyCode==Keys.A)
{
}按键向下事件将仅保存最近按下的按键的信息。我成功地构建了一个字符串,其中包含所有连接在一起的最新向下键
如果单击了“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();
}
}
对于上面的函数,我的热键将是“Control(清除字符串)+i+n+t”,以触发我的AdminLoginVn方法。adminLogin布尔值已合并,因此我只在应用程序打开时运行AdminLoginVn一次 这在我的键盘上永远不会是真的-例如,如果我按下lshift键和Keys.Up,它e.Shift永远不会是真的,而e.Modifiers总是保持为无。知道为什么吗?看来箭头键在某种程度上很特别。这个问题给了我们一些启示:我发现只有e.Key,但没有e.KeyCode。也没有e.Modifier。@KMC令人困惑的是,有两个不同的KeyEventArgs
。我假设您使用的是Windows.UI.Core
事件中的corewindown
中的一个。这个答案是关于一个不同的事件。谢谢你,这个工作很完美if(e.Control&&e.KeyCode==Keys.A)
Over,表示数据在KeyData字段中。这里没有人提到过。这些答案不正确吗?很好地抓住了@jp2codeModifierKeys
是Control
上的一个属性(例如windows窗体),它将为您提供有关当前正在按下的修改器键的信息<键事件随附的code>KeyData
包含有关与键一起按下导致事件的修改器键的信息。回想起来,我想说的是,ModifierKeys
与按钮单击或类似事件一起更有趣,在关键事件期间使用KeyData
更准确。注意:这是WPF。@TaW-我们正在运行一个XBAP应用程序(在Internet Explorer中运行的WPF)。因此,在这种情况下,您仍然需要使用Set the key stroke asHandled
,否则IE将拾取它。XBAP不是一个广泛使用的框架,但我想我应该让你知道我为什么要讨论如何处理浏览器:)-谢谢。在回答一篇旧文章时,如果你能为你的答案提供一些上下文而不仅仅是代码,那将是很有帮助的,因为这可能会使它对其他人更有用。
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();
}
}