2009-11-20 5 views
2

J'ai utilisé un ActiveXControl dans une application C# Forms et j'ai eu la possibilité d'implémenter un gestionnaire d'événements PreviewKeyDown pour ce ActiveXControl. Cela était nécessaire pour spécifier que, par ex. la touche [ALT] est une touche d'entrée.Équivalent de PreviewKeyDown de C# requis pour C++/MFC

Pour certaines raisons ou autres, je dois réimplémenter l'application en C++/MFC natif et ne pas savoir comment spécifier que cette touche [ALT] est une clé d'entrée et être gérée par le ActiveXControl.

Répondre

0

N'ont pas essayé cela, mais MSDN ne dit pas que vous n'obtiendrez pas un WM_KEYDOWN pour la touche ALT - toute autre touche enfoncée alors que ALT est en panne génère un WM_SYSKEYDOWN, mais cela ne dit pas que vous ne peut pas gérer ALT via WM_KEYDOWN.

0

Vous pouvez utiliser SetTimer pour générer un événement WM_TIMER 20 fois par seconde ou

SetTimer(NULL, kMyTimer, 50, MyTimerCallback); 

mettent ensuite en œuvre une fonction comme suit.

void CALLBACK MyTimerCallback(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) 
{ 
     static short lastLeftAltPress = 0; 
     short thisLeftAltPress = GetAsyncKeyState(VK_LMENU); 
     if (thisLeftAltPress != 0 && lastLeftAltPress == 0) 
     { 
      CallAltHandlingCode(); 
     } 
     thisLeftAltPress = lastLestAltPress; 

     // Handling code for other keys goes here. 
} 

Cela sondage par le clavier tous 50ms pour savoir si la touche alt gauche vient d'être pressé puis appeler votre code de manipulation. Si vous voulez tirer le gestionnaire lorsque son libéré alors vous utilisez ce qui suit l'instruction if

if (thisLeftAltPress == 0 && lastLeftAltPress != 0) 

ou si vous voulez juste pour voir si elle est en baisse, alors vous ne

if (thisLeftAltPress != 0) 

Les docs pour GetAsyncKeyState faites l'état que vous pouvez vérifier si le bit le plus bas est défini pour voir si la clé vient d'être pressée mais il indique également que cela peut échouer de manière inattendue dans des environnements multithread. Le schéma ci-dessus devrait toujours fonctionner.

0

merci pour toutes vos recommandations.

Pour mon cas, j'ai finalement trouvé un moyen de le faire fonctionner. Jusqu'à présent, ce que j'ai appris, c'est qu'un événement PreviewKeyDown est déclenché avant l'envoi du message KeyDown.

J'ai implémenté PreTranslateMessage dans le dialogue qui héberge le contrôle ActiveX et appelé :: SendMessage (WM_KEYDOWN ...) avec le descripteur du contrôle ActiveX, en utilisant pMsg pour les arguments.

Cheers,

Ilmari