Comment attraper des événements de clavier de la forme principale WinForm, où d'autres contrôles sont. Donc, je veux attraper un événement Ctrl kbd> + s kbd> et peu importe la mise au point. Mais sans pinvoke (crochets et tels ...) Seule la puissance interne gérée. P>
4 Réponses :
Le classe de formulaire (System.Windows.Forms) a ONKEYDODOW , OnKeyPress et OnKeyUp Méthodes d'événement que vous pouvez utiliser pour détecter Ctrl kbd> + s kbd> p>
Utilisez le keeventargs dans ces méthodes Pour déterminer quelles touches ont été appuyées sur p>
Edit p>
Assurez-vous d'activer form.keypreview = true; code> de sorte que le formulaire capturera les événements indépendamment de la mise au point. P>
Vous avez manqué la nécessité «Peu importe l'endroit où concentrez-vous».
Avez-vous lu: «Donc, je veux attraper un événement Ctrl + S et peu importe où se concentre la mise au point». Veuillez lire attentivement.
gérer la touche code> sur le formulaire et toutes ses commandes. private void OnFormLoad(object sender, EventArgs e)
{
this.KeyDown += OnKeyDown;
foreach (Control control in this.Controls)
{
control.KeyDown += OnKeyDown;
}
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Control)
{
if (e.KeyValue == (int)Keys.S)
{
Console.WriteLine("ctrl + s");
}
}
}
Avez-vous lu: «Donc, je veux attraper un événement Ctrl + S et peu importe où se concentre la mise au point». Veuillez lire attentivement.
@ROBB: Oui, j'ai lu cela, mais j'ai supposé que la phase n'a pas d'importance où la mise au point est code> se référant à l'intérieur du formulaire ou de ses commandes afin que la mise au point sur l'exemple d'un Textbox1 code> ou dans le formulaire. N'est-ce pas que vous vouliez dire?
@Robb: Avez-vous remarqué la question sur mon commentaire précédent?
Jalal, Yas je voulais dire que ... mais si cette question n'est que sur l'événement clé, alors je ne demanderais pas. J'appliquais à P / Invoke Keyboard Crown Proc avant, et la réponse d'Ashish était expressément ce que je cherchais.
Essayez ce code. Utilisez l'interface imessagefilter code> Vous pouvez filtrer n'importe quelle touche Ctrl kbd> +. public partial class Form1 :
Form,
IMessageFilter
{
public Form1()
{
InitializeComponent();
Application.AddMessageFilter(this);
this.FormClosed += new FormClosedEventHandler(this.Form1_FormClosed);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Application.RemoveMessageFilter(this);
}
public bool PreFilterMessage(ref Message m)
{
//here you can specify which key you need to filter
if (m.Msg == 0x0100 && (Keys)m.WParam.ToInt32() == Keys.S &&
ModifierKeys == Keys.Control)
{
return true;
}
else
{
return false;
}
}
}
Vous pouvez ajouter un MENUSDIP, puis créer un élément de bandes de menu nommé Enregistrer et lui donner une coupe courte Ctrl + S. Ajoutez un gestionnaire d'événements pour cela. Cela tirera même si l'accent sera mis sur un autre contrôle sur la forme. Si vous n'aimez pas voir le ménousting; Vous pouvez définir visible = false aussi. Je dois admettre que cela est laid. P>
Dupliqué possible de Meilleur moyen d'implémenter des raccourcis clavier dans Winforms?