2009-06-18 6 views
1

Je dois saisir des keystokes à partir d'un périphérique en coin et empêcher les commandes ou le formulaire de les recevoir. J'ai aussi besoin d'être capable de connaître la valeur (char). J'ai essayé de remplacer les événements ProcessCmdKey (Keys) et ProcessDialogChar (char). Dans l'événement ProcessCmd, je peux supprimer la séquence de touches si j'en ai une, mais le caractère n'est pas un paramètre de l'événement. Dans l'événement ProcessDialogChar, le caractère est présent, mais je ne peux pas empêcher le formulaire ou le contrôle avec le focus de recevoir la clé. Suggestions?Saisir les touches du clavier

Répondre

1

Ce n'était pas comme cela que je voulais le faire, mais parce que j'avais besoin de le réparer et de passer à autre chose, j'ai mis un textbox caché sur le formulaire et dès que je vois le début de la chaîne de données Je veux capturer j'ai mis l'accent sur cette zone de texte et répondre à l'événement TextChanged. Si je n'ai pas vu le caractère de fin avant l'expiration de la temporisation, j'efface la zone de texte et recommence. Kludge, mais cela fonctionne et m'a amené à la tâche suivante.

5

Vous voulez ajouter cette pendant le chargement du formulaire:

Application.AddMessageFilter(this); 

Ajouter cette constante:

private const int WM_KEYDOWN = 0x100; 

Et cette méthode:

public bool PreFilterMessage(ref Message m) 
{ 
    Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; 
    bool retVal = false; 

    if (m.Msg == WM_KEYDOWN) 
    { 
     // Handle the keypress 
     retVal = true; 
    } 

    return retVal; 
} 

En retournant true, votre formulaire et le (s) contrôle (s) ne verront jamais la touche.

+0

Couple de notes pour les choses que je n'ai pas précisé: Vous devez implémenter IMessageFilter, qui a une méthode, PreFilterMessage. Vous n'avez pas besoin de l'implémenter sur votre formulaire, vous pouvez créer un objet complètement séparé si vous voulez implémenter cette interface. Bien que je ne sois pas sûr, vous devriez pouvoir appeler AddMessageFilter avant que votre formulaire soit créé, puisque le filtre de message appartient à la pompe de messages de votre thread graphique. – jasonh

+0

Merci, j'ai fait cela et cela fonctionne, mais je suis toujours dans la même situation que j'étais avec l'écrasement ProcessCmdKey. Je n'ai pas le caractère réel entré. Par exemple sur mon clavier le caractère '^' est keyCode D6. Je suppose que la touche Maj peut être supprimée de l'un des paramètres. J'essaie d'éviter de traduire moi-même les personnages. – jac

Questions connexes