问题
How can I determine in KeyDown
that CtrlUp was pressed.
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up)
{
//do stuff
}
}
can't work, because never both keys are pressed exactly in the same second. You always to at first the Ctrl and then the other one...
回答1:
You can check the modifiers of the KeyEventArgs like so:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control)
{
//do stuff
}
}
MSDN reference
回答2:
From the MSDN page on KeyEventArgs:
if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
//Do stuff...
}
回答3:
In the KeyEventArgs
there are properties Ctrl, Alt and Shift that shows if these buttons are pressed.
回答4:
You can try using the Keyboard
object to detect the IsKeyDown
property. Also, if you don't want the browser shortcut to over-ride you can set Handled
property to true.But be careful when over-riding browser shortcuts as it could cause confusion.
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;
}
}
回答5:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Up && Keyboard.IsKeyDown(Key.LeftCtrl))
{
//do stuff
}
}
This code will work only if you press first LeftCtrl, then "UP". If order has no importance, I recommend that one :
if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))&& Keyboard.IsKeyDown(Key.Z))
{
//do stuff
}
In that case, both Ctrl are taken in account, and no importance about the order.
回答6:
You can use the ModifierKeys property:
if (e.KeyCode == Keys.Up && (ModifierKeys & Keys.Control) == Keys.Control)
{
// CTRL + UP was pressed
}
Note that the ModifierKeys value can be a combination of values, so if you want to detect that CTRL was pressed regardless of the state of the SHIFT or ALT keys, you will need to perform a bitwise comparison as in my sample above. If you want to ensure that no other modifiers were pressed, you should instead check for equality:
if (e.KeyCode == Keys.Up && ModifierKeys == Keys.Control)
{
// CTRL + UP was pressed
}
回答7:
I tested below code. it works...
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if ((int) e.KeyData == (int) Keys.Control + (int) Keys.Up)
{
MessageBox.Show("Ctrl + Up pressed...");
}
}
回答8:
this will work for sure. Be careful to handle KeyUp
event and not keyDown
.
private void mainForm_KeyUp(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
{
//insert here
}
}
For me, keyDown
didn't work, keyU
p worked instead for the same code.
I don't know why, but it seems because keyDown
event happens directly after you press any key, even if that was ctrl key, so if you pressed ctrl+Up you will press ctrl key before the UP key and thus the event will occur before you can press the other, also pressing the second key will triggers the event again.
While using KeyUp
will not trigger the event until you release the key, so you can press ctrl, and the press the second key, which will trigger one event.
回答9:
It took me a while to find the hint I ultimately needed when trying to detect [Alt][Right]. I found it here: https://social.msdn.microsoft.com/Forums/vstudio/en-US/4355ab9a-9214-4fe1-87ea-b32dfc22946c/issue-with-alt-key-and-key-down-event?forum=wpf
It boils down to something like this in a Shortcut
helper class I use:
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)
{
...
}
After "re-mapping" the original values (notice the e.Key == System.Windows.Input.Key.System ? e.SystemKey : e.Key
part), further processing can go on as usual.
回答10:
if (e.Control && e.Shift && e.KeyCode == Keys.A) {
}
回答11:
you can try my working code :
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
if(e.Alt==true){
//do your stuff
}
}
}
i use this code because i don't know why when i use :
(e.Keycode == Keys>up && e.Alt==true)
didn't work.
回答12:
you have to remember the pressed keys (ie in a bool array). and set the position to 1 when its pressed (keydown) and 0 when up .
this way you can track more than one key. I suggest doing an array for special keys only
so you can do:
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
来源:https://stackoverflow.com/questions/1265634/keydown-recognizing-multiple-keys