2

J'ai écrit un Add-In pour Visual Studio 2005/2008. Il affichera une fenêtre avec des contrôles d'édition en tant que fenêtres enfants. Mais si elle est ouverte VSPourquoi j'ai perdu le focus d'entrée dans Visual Studio 2005/2008

  1. avec un document, puis ouvrir mon Add-In, les contrôles d'édition des enfants vont perdre le focus d'entrée lorsque le type Tab/Supprimer/Backsapace/Ctrl-C, etc.
  2. sans aucun document et ouvre mon Add-In, c'est OK.

Je pense avoir trouvé la raison. Si je supprime une liaison de commande dans VS, telle que la commande Edit.InsertTab binding avec Tab, alors lorsque je tape Tab dans mon Add-In, le focus d'entrée ne sera pas perdu.

Et j'ai essayé de remplacer ma fenêtre Add-In avec un dialogue modal, c'est une surprise pour moi, la mise au point d'entrée ne sera pas perdue.

Je veux savoir pourquoi. Et je ne veux pas utiliser le dialogue. Tout le monde peut me dire comment le résoudre. Merci.

Répondre

3

La raison est due à la manière très complexe dont l'entrée au clavier est routée dans Visual Studio.

La boucle de messages Visual Studio donnera la priorité aux messages Windows (à l'exception de l'entrée alphanumérique) aux commandes Visual Studio. Il appellera dans la chaîne IOleCommandTarget pour le IVsTextView actif. Les clés que vous avez mentionnées sont spécialement gérées par certaines parties de l'éditeur et, par conséquent, elles ont la priorité, gèrent le message et entraînent une perte de focus de votre entrée.

Pour contourner ce problème, ajoutez une instance IOleCommandTarget dans la chaîne cible de la commande OLE IVsTextView pour la vue active. Lorsque votre fenêtre est active, vous pouvez intercepter les clés données, les marquer comme désactivées, puis elles seront routées vers votre fenêtre.

J'aimerais donner un petit extrait de code ici, mais malheureusement il n'y a pas de petit fragment de code qui démontre adéquatement cette solution. Au lieu de cela, je vais vous diriger vers la même astuce utilisée dans mon émulateur Vim pour Visual Studio.

+0

Merci beaucoup. Wow, vous êtes l'auteur de VsVim. Je suis un débutant à la programmation Windows. Et, pourriez-vous me dire pourquoi il n'y a pas le problème avec le dialogue modal. –

+0

@Cook, honnêtement je ne comprends pas profondément pourquoi le dialogue modal n'est pas un problème. Il est probable que les cas particuliers de Visual Studio soient entrés lorsqu'une boîte de dialogue modale est active (dans certains cas) ou que le message est simplement routé dans la boucle de message de la boîte de dialogue modale. Mon pari est sur l'ancien cependant. – JaredPar