2010-10-01 26 views
0

Je dois traiter enter (parmi d'autres clés) sur la forme win sans qu'elle produise un son d'erreur, mais seulement si le contrôle actif n'est pas déjà traité. Donc, quand enter est pressé dans un TextBox ou un DateTimePicker, je veux le traiter avec un formulaire (sans son d'erreur), mais s'il est pressé, par exemple, dans DataGridView, je veux qu'il soit géré de la manière DataGridView le fait par défaut. OnKeyUp résout mon problème en gérant uniquement les frappes non gérées (e.Handled) et ProcessCmdKey (this) résout le problème de son, mais ne résout pas les deux.Traitement de la clé d'entrée non traitée C#

Des suggestions?

Répondre

0

Félicitations pour la question très intéressante. Malheureusement, je n'arrive pas à trouver un gestionnaire d'événements global pour toutes les pressions de touches autres que la substitution de ProcessCmdKey sur le formulaire principal par this article. Le seul problème avec cette méthode est que les arguments passés dans le délégué du gestionnaire d'événements ne définissent pas le contrôle qui crée l'événement :(

Donc, je pense que vous devez affecter votre gestionnaire d'événement à chaque contrôle dans J'ai écrit un code qui devrait vous aider à le faire, mais je ne suis pas sûr des effets négatifs que pourrait avoir l'assignation d'un gestionnaire d'événement KeyPress à tous les contrôles de votre page, mais c'est la seule solution possible Je vois

. code:

private void Form1_Load(object sender, EventArgs e) 
{ 
    AssignHandler(this); 
} 

protected void HandleKeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)Keys.Enter && (sender != this.textBoxToIgnore || sender ! this.gridViewToIgnore)) 
    { 
     PlaySound(); // your error sound function 
     e.Handled = true; 
    } 
} 

public void AssignHandler(Control c) 
{ 
    c.KeyPress += new KeyPressEventHandler(HandleKeyPress); 
    foreach (Control child in c.Controls) 
    { 
     AssignHandler(child); 
    } 
} 
+0

le paramètre Msg à ProcessCmdKey contient le HWND du contrôle cible (fenêtre) . Vous pouvez utiliser Control.FromHandle pour obtenir l'objet de contrôle géré. – Tergiver

+0

Je ne savais pas que la manipulation de KeyPress empêche le son d'erreur. Je l'ai essayé avec KeyUp et je suppose que ça ne fonctionnerait pas non plus avec KeyPress. Toutefois, pour capturer les événements Key du formulaire, vous n'avez pas besoin de faire tout cela, il suffit de définir la propriété KeyPreview du formulaire sur true et de gérer ses événements Key. – Damir

+0

De plus, pour éviter d'indiquer explicitement quels contrôles saisissent ou ne traitent pas, il suffit d'ajouter &&! E.Handled dans l'instruction if – Damir