2008-10-20 8 views
3

J'ai écrit une barre d'outils IE en C# et tout fonctionne bien sauf que lorsque j'ouvre un formulaire Windows enfant à partir de ma barre d'outils, la touche de tabulation ne fonctionne pas sur le formulaire enfant pour me permettre de passer d'un champ à l'autre. La partie intéressante est que lorsque j'ouvre mon formulaire enfant en utilisant form.showDialog() au lieu de form.show(), les onglets fonctionnent normalement.Internet Explorer Toolbar Tab touche

La barre d'outils que j'ai créé est basé sur ce article et ce article

J'ai mis en TranslateAcceleratorIO comme mentionné dans plusieurs articles, mais toujours pas de chance.

Voici mes implmentations de TranslateAcceleratorIO() et HasFocusIO() (Implémenté dans ma classe toolband)

 [DllImport("user32.dll")] 
     public static extern int TranslateMessage(ref MSG lpMsg); 

     [DllImport("user32", EntryPoint = "DispatchMessage")] 
     static extern bool DispatchMessage(ref MSG msg); 

     public int HasFocusIO() 
     {        
      return this.ContainsFocus ? 0 : 1; //S_OK : S_FALSE; 
     } 

     public int TranslateAcceleratorIO(ref MSG msg) 
     {     
      if (msg.message == 0x100)//WM_KEYDOWN 
       if (msg.wParam == (uint)Keys.Tab || msg.wParam ==(uint)Keys.F6) 
       { 
        if (SelectNextControl(
          ActiveControl, 
          ModifierKeys == Keys.Shift ? false : true, 
          true, 
          true, 
          false) 
         ) 
        { 
         return 0;//S_OK 
        } 
       } 
       else 
       {       
        TranslateMessage(ref msg); 
        DispatchMessage(ref msg); 
        return 0;//S_OK 
       } 
      return 1;//S_FALSE 
     } 

J'ai aussi essayé d'avoir TranslateAccelerator comme ça avec pas de chance:

public int TranslateAcceleratorIO(ref MSG msg) 
    { 

     TranslateMessage(ref msg); 
     DispatchMessage(ref msg); 
     return 0;//S_OK 
    } 

Est-ce que quelqu'un d'autre a rencontré ce problème?

+0

Avez-vous déjà trouvé ce correctif? – wpfwannabe

+0

@wpfwannabe Malheureusement, je ne me souviens pas si nous avons résolu ce problème particulier, et c'était chez mon employeur précédent, donc je ne peux pas regarder le code pour le savoir. – Millhouse

Répondre

1

Implémentez-vous également HasFocusIO? Je crois que votre classe de barre d'outils principale doit également implémenter HasFocusIO et renvoyer true.

Ces types de problèmes avec les barres d'outils IE ont été le fléau de mon existence pendant un certain temps. Je pense que ce que j'ai finalement fini par faire était de créer des threads d'interface utilisateur séparés et de rendre mes boîtes de dialogue modales dans ces threads, ce qui a éliminé un tas de problèmes étranges. Mais je pense que la mise en œuvre de HasFocusIO et TranslateAcceleratorIO devrait fonctionner pour celui-ci en particulier.

0

Où les mettez-vous en œuvre? Il est difficile de dire à partir de ce que vous avez là, les mettez-vous en œuvre dans votre formulaire ou les mettez-vous en œuvre dans votre classe de bureau?

Vous devez les implémenter dans votre implémentation DeskBand, et HasFocusIO doit retourner vrai chaque fois que l'une de vos fenêtres a le focus (pas seulement lorsque la barre d'outils a le focus). Ensuite, les messages pour Tab, Delete, les touches fléchées, etc doivent être envoyés à TranslateAcceleratorIO, également dans votre bureauband, et à partir de là, vous devrez les transmettre à votre formulaire.

La structure du plugin IE est incroyablement hacky de cette façon.

+0

Les méthodes que j'ai postées sont implémentées dans mon deskband. J'ai branché le débogueur et j'ai remarqué que mon HasFocusIO() ne se fait jamais appeler, donc il doit y avoir un problème avec la façon dont je suis accroché dans IE. – Millhouse