如何在KeyDown
中确定按下了 Ctrl Up 。
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up)
{
//do stuff
}
}
无法正常工作,因为永远不会在同一秒内完全按下两个键。你总是先找到 Ctrl 然后另一个......
答案 0 :(得分:28)
您可以像这样检查KeyEventArgs的修饰符:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control)
{
//do stuff
}
}
答案 1 :(得分:10)
if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
//Do stuff...
}
答案 2 :(得分:7)
在KeyEventArgs
中有属性 Ctrl , Alt 和 Shift ,显示是否按下了这些按钮。
答案 3 :(得分:5)
您可以尝试使用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;
}
}
答案 4 :(得分:2)
您可以使用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
}
答案 5 :(得分:2)
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,而不重视订单。
答案 6 :(得分:1)
我测试了以下代码。它有效...
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if ((int) e.KeyData == (int) Keys.Control + (int) Keys.Up)
{
MessageBox.Show("Ctrl + Up pressed...");
}
}
答案 7 :(得分:0)
这肯定会奏效。小心处理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 您将在 UP 键之前按 ctrl 键,因此事件将在您按下另一个之前发生,同时按第二个键将再次触发事件。
虽然在释放密钥之前使用KeyUp
将不会触发事件,因此您可以按 ctrl ,然后按第二个键,这将触发一个事件。
答案 8 :(得分:0)
我花了一段时间才找到试图检测[Alt] [Right]时最终需要的提示。我在这里找到它:https://social.msdn.microsoft.com/Forums/vstudio/en-US/4355ab9a-9214-4fe1-87ea-b32dfc22946c/issue-with-alt-key-and-key-down-event?forum=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
部分)之后,可以照常进行进一步处理。
答案 9 :(得分:0)
if(例如e.Control && e.Shift && e.KeyCode == Keys.A) {
}
答案 10 :(得分:0)
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();
}
}
对于我的热键上方的功能,将是“ Control(清除字符串)+ i + n + t”以触发AdminLoginEvn方法。合并了adminLogin布尔值,因此我只在打开应用程序时运行AdminLoginEvn一次。
答案 11 :(得分:-1)
您可以尝试我的工作代码:
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)
没有工作。
答案 12 :(得分:-2)
你必须记住按下的键(即在bool数组中)。按下(keydown)时将位置设置为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