I need to capture multiple keys in the same time like "Shift+Insert" how I can use this using System.Windows.Input.KeyEventArgs. I've written some code but it doesn't work:
private void Grid1KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Shift && e.Key == System.Windows.Input.Key.Insert)
{
//do something
}
}
Could anyone help me?
Note: In silverlight project you are not allowed to use "System.Windows.Forms".
Rather try something like
if (e.Shift && e.Key == System.Windows.Input.Key.Insert)
{
//do something
}
Have a look at KeyEventArgs Class
A KeyEventArgs, which specifies the key the user pressed and whether
any modifier keys (CTRL, ALT, and SHIFT) were pressed at the same
time, is passed with each KeyDown or KeyUp event.
You could also look at KeyEventArgs.Modifiers Property
Gets the modifier flags for a KeyDown or KeyUp event. The flags
indicate which combination of CTRL, SHIFT, and ALT keys was pressed.
Related
I know that I can have a key press event like this-
private void FormMain_KeyDown(object sender, KeyEventArgs e){
//Pressing Control + N
if(e.KeyData == (Keys.Control | Keys.N)) MessageBox.Show("e");
}
But is there any way I can check to see whether the space key is pressed in a different function? I know that I can check to see if the CTRL key is being pressed, like this
if (Control.ModifierKeys == Keys.Shift)
I tried the following code, but it doesn't work. Is there a way to do it like this?
if (Control.ModifierKeys == Keys.Space)
This question already has answers here:
WinForms - Capturing the combination of key presses using ProcessCmdKey VS KeyDown
(3 answers)
Closed 8 years ago.
My program has several key combinations, but whenever Shift, Alt or Control is pressed, they override any other keys that are not one of those 3, even though they don't override each other. Can someone please help me find a way to make sure the KeyEventArgs (or some equivalent function) gets both, like for example Shift + W? In the code below, I only every get the shift writeline, never the combo, regardless if I started by holding down the W or the Shift.
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Shift)
{
if (e.KeyData == Keys.W || e.KeyData == Keys.S)
{
Console.WriteLine("combination");
}
Console.WriteLine("shift");
}
}
The KeyData property exposes the key that was pressed as well as the modifiers that are active. So you'd use it like this:
private void Form1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyData == (Keys.Shift | Keys.W) || e.KeyData == (Keys.Shift | Keys.S)) {
Console.WriteLine("combination");
}
}
You can do it your way as well, but then you have to use a different property, KeyCode. It exposes only the key code without the modifier keys:
private void Form1_KeyDown(object sender, KeyEventArgs e) {
if (e.Shift) {
Console.WriteLine("shift");
if (e.KeyCode == Keys.W || e.KeyCode == Keys.S) {
Console.WriteLine("combination");
}
}
}
Which one you'd use is entirely up to you. Do however keep in mind that using the form's KeyDown event is not very correct. It also requires setting the KeyPreview property to true. That's a pretty ugly VB6 compatibility property, you cannot see every possible keystroke. The navigation keys are filtered, like it was done in VB6. The native Winforms way is to override the ProcessCmdKey() method instead. Which does require you to work with KeyData.
private void timer1_Tick(object sender, EventArgs e){
if (Form.ModifierKeys == System.Windows.Forms.Keys.Control
&& Form.ModifierKeys == System.Windows.Forms.Keys.Enter)
my_translate(textbox1.text);
}
.
I try it but dont work how can I do it?
I am writing a dictionary software; with timer I check determine pressed keys so I translate word. I cant use textBox1_KeyPress etc. because I get text from .doc/.txt so I need timer for get text.
//The code is working
private void timer1_Tick(object sender, EventArgs e){
MouseButtons aa = MouseButtons;
if (aa == MouseButtons.Middle && Form.ModifierKeys == Keys.Control)
my_translate();
}
.
And We have a alnernative for timer to call a method when user pressed a key combination?
Your current code
if (Form.ModifierKeys == System.Windows.Forms.Keys.Control &&
Form.ModifierKeys == System.Windows.Forms.Keys.Enter)
means "if the keys pressed equals the control key AND the keys pressed equals the enter key". This will never happen, because if only the control key is pressed, the enter key is not pressed, and vise versa.
I believe you wanted this:
if (Form.ModifierKeys.HasFlag(Keys.Control) &&
Form.ModifierKeys.HasFlag(Keys.Enter))
This means "if the keys pressed includes the control key and the enter key".
You shouldn't use timers for this anyways. Look into the Control.KeyPress event and use that instead. You can use the timer to load the text file while using events to handle the key press.
I suggest you read more about the KeyPress event on MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx
I have a textbox on a form where I'm trying to detect the keys the user types in. The TextBox is multilined with wordwrap on. I don't want the user the press the enter key (as I want all text entered on ONE line, wrapped) so I used the following code:
private void txtPlain_KeyPress(object sender, KeyPressEventArgs e) {
if (e.KeyChar == (char)13) {
MessageBox.Show("Enter keys are not allowed");
e.KeyChar = (char)0;
}
}
This worked fine in my tests, but when I tested for CTRL+ENTER it didn't work as I'm not sure how to detect for the control key. From my googling I found that I need to use the KeyUp/Down events so I now have the following Code:
private void txtPlain_KeyUp(object sender, KeyEventArgs e) {
//if (e.KeyData == (Keys.Control | Keys.Enter)) {
if (e.KeyCode == Keys.Enter || (e.KeyCode == Keys.Enter && e.Control)) {
MessageBox.Show("Enter keys are not allowed:");
//e.KeyValue = Keys.None;
}
}
The first commented out line didn't work for some reason so if anyone could explain why this would be useful.
The problem with the KeyUp/Down event is that I don't know how to REMOVE the enter key from the text - unlike the KeyPress event when I can set the KeyChar to zero. The event captures both the Enter and Ctrl+Enter keys, but the cursor still goes to the next line in the TextBox.
Thanks for any help on this.
Hmm, there's no reason to disallow the Enter key by handling the KeyDown or KeyUp events. You can simply set the AcceptsReturn property of the textbox control to False. This will prevent a multiline textbox from responding to a press of the Enter key.
Of course, this doesn't solve the problem of Ctrl+Enter. In fact, that's the expected way to create a new line when the AcceptsReturn property is set to False. To solve that, you will need to handle one of the keyboard events and prevent the control from receiving this input.
KeyDown is a good place to start. What you want to do is filter out any keyboard events that include the Keys.Enter flag. That will catch them no matter which other modifier key they might be combined with. Then, once you've found an Enter keypress, you want to set the e.Handled property to True in order to prevent it from being passed on to the control.
But unfortunately, we're not quite done yet. The textbox control tries to handle certain keys internally, and you're not going to be able to override that in a key event handler method. You also need to tell the control not to interpret that particular key as an input key. There are two primary ways of doing this. The first (and recommended way) is to inherit from the base TextBox class to create your own custom control, and then override the protected IsInputKey method. The second (somewhat simpler) way is just to handle the PreviewKeyDown event, and set the IsInputKey property to False.
Sample code:
private void txtPlain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
// Check if the KeyCode value has the Keys.Enter flag set
if ((e.KeyCode & Keys.Enter) == Keys.Enter)
{
// Set the IsInputKey property to False
e.IsInputKey = false;
}
}
private void txtPlain_KeyDown(object sender, KeyEventArgs e)
{
// Check if the KeyCode value has the Keys.Enter flag set
if ((e.KeyCode & Keys.Enter) == Keys.Enter)
{
// Show the user a message
MessageBox.Show("Enter keys are not allowed in this textbox.");
// Prevent the key event from being passed on to the control
e.Handled = true;
}
}
And, though I assume this is for testing purposes only, you definitely want to take that MessageBox call out of there for production code. Find another way to alert the user that their input was not allowed, such as a short beep sound and an ErrorProvider component placed next to the textbox. Showing a message box is very jarring, and not very user-friendly. See my answer here for other hints and tips.
private void txtPlain_KeyUp(object sender, KeyEventArgs e) {
//if (e.KeyData == (Keys.Control | Keys.Enter)) {
if (e.KeyCode == Keys.Enter || (e.KeyCode == Keys.Enter && e.Control)) {
MessageBox.Show("Enter keys are not allowed:");
//e.KeyValue = Keys.None;
// mark event as handled
e.Handled = true;
}
}
from msdnlink
edit:
I think that you need the key down event not the key up
EDIT2
here is some tested code and it works as you wanted:
bool invalid=false;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode & Keys.Enter) == Keys.Enter)
{
invalid = true;
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (invalid)
{
e.Handled = true;
}
invalid = false;
}
The first commented out line didn't work for some reason so if anyone could explain why this would be useful.
You wanted to detect Ctrl + Enter.
if (e.KeyData == (Keys.Control | Keys.Enter)) {..
Keys.Control and Key.Enter are nothing but are some values please refer . Now doing logical or will not necessarily result to key which has been pressed. Totally illogical clause.
Ok now come to your actual problem you want to detect Enter stroke and Ctrl + Enter stroke to be treated as same.
Besides you want to undo the newline character thats been introduced. Try
PreviewKeyDown or Preview key up eventhandler with the following condition
if(e.KeyCode==Keys.Enter)
Let me know if this works
I'm actioning a method on a text box's KeyPress event, but the method is being run before the key is actually typed into the box.
If I use KeyUp, I get the behaviour I'm looking for, except KeyUp triggers on soft keys as well as standard characters, which isn't particularly useful for me.
Can I get KeyPress to run after the key is typed into the box? Or can I easily get KeyUp to ignore soft keys?
Well, you can remember keychar in KeyPress event, and do all necessary logic in KeyUp, using remembered char.
In your keypress event, you can concatenate textbox.Text and e.KeyChar into a new string and process this new string.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
string newString = textBox1.Text + e.KeyChar.ToString();
// Process newString
// If after processing you do not wish to undo the typed letter do
// e.Handled = true;
}
Use keyUp with as code:
private void textBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
//only do things when an alphabetical character is typed
if ((e.KeyCode >= Keys.a) && (e.KeyCode <= key.z) ||
(e.KeyCode >= Keys.A) && (e.KeyCode <= key.Z))
{
// do your thing
}
}
You can ofcourse also check on other characters like . etc.
You can also try the TextChanged event from your textbox control.