2010-04-25 4 views
2

Dans .Net, il existe une fonctionnalité appelée KeyPreview. Comment puis-je faire cela dans WinApi. Peut-être que je n'en ai pas forcément besoin mais mon hWnd a WM_KEYDOWN, mais il ne le reçoit pas quand mon Text Box a le focus. Comment puis-je atteindre cet objectif? MerciWinApi équivalent de .NET KeyPreview

* Utilisation Win32API pur ...

est-il une alternative, comment pourrais-je gérer WM_KEYDOWN du texte Box?

+0

Que fait exactement KeyPreview? – jalf

Répondre

0

Vous pouvez essayer de sous-classer le contrôle d'édition. Soit "sous-classe d'instance", pour intercepter des messages pour une seule fenêtre, ou "sous-classe globale" pour intercepter des messages pour toutes les fenêtres de cette classe (dans votre application, pas à l'échelle du système).

L'exemple ici (http://msdn.microsoft.com/en-us/library/ms997565.aspx) montre comment sous-classer un contrôle d'édition et intercepter le message WM_GETDLGCODE - il ne serait pas si difficile de le changer en WM_KEYDOWN.

Vous pouvez rencontrer des problèmes lors de la prévisualisation des touches utilisées pour les commandes de dialogue, par ex. TAB ou RETURN, car ils peuvent être piégés plus haut dans la chaîne alimentaire. Vous devrez peut-être également modifier WM_GETDLGCODE.

0
  1. Si vous utilisez MFC vous pouvez regarder PreTranslateMessage (je ne suis pas sûr en ce qui concerne à PreTranslateMessage, mais vous pouvez facilement vérifier si à assez pour passer outre la fonction).
  2. Vous pouvez définir le crochet du clavier.
+1

Veuillez ne pas accrocher le clavier. Filtrer les messages dans la boucle de répartition des messages est une option raisonnable, mais seulement si aucune boucle de message modale n'est active. –

0

Il n'y a pas une telle possibilité dans WinAPI pour attraper les messages appartenant aux contrôles dans la procédure de fenêtre de la fenêtre parent (bien que quelques exceptions existent). Ce que NET fait essentiellement, c'est qu'il achemine tous les messages de tous les contrôles, y compris leur fenêtre parent, vers une procédure à fenêtre unique. Ensuite, il est facile d'attraper tous les messages en un seul endroit. C'est votre chemin à parcourir - définir les procédures de fenêtre de tous les contrôles en une seule procédure et là pour attraper tous les messages Comme la procédure de fenêtre reçoit également le paramètre hwnd, il est également facile de déterminer le contrôle auquel appartient le message.

Questions connexes