2008-10-20 2 views
3

Я написал панель инструментов IE на C#, и все работает отлично, за исключением того, что когда я открываю дочернюю форму Windows из моей панели инструментов, ключ вкладки не работает над дочерней формой, чтобы я мог перейдите из поля в поле.Клавиша вкладки панели инструментов Internet Explorer

Интересная часть заключается в том, что когда я открываю свою дочернюю форму, используя form.showDialog() вместо form.show(), вкладки работают как обычно.

Панель инструментов я создал на основе этого article и это article

Я реализовал TranslateAcceleratorIO, как не упоминается в нескольких статьях, но до сих пор не повезло.

Вот мои implmentations из TranslateAcceleratorIO() и HasFocusIO() (реализованные в классе 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 
     } 

Я также попытался имея TranslateAccelerator, как это не повезло:

public int TranslateAcceleratorIO(ref MSG msg) 
    { 

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

Кто-нибудь еще сталкивается с этой проблемой?

+0

Вы когда-нибудь исправляли это? – wpfwannabe 2011-10-03 08:42:39

+0

@wpfwannabe К сожалению, я не помню, решили ли мы эту конкретную проблему, и это было у моего предыдущего работодателя, поэтому я не могу посмотреть на код, чтобы узнать. – Millhouse 2011-10-17 17:57:25

ответ

1

Вы также реализуете HasFocusIO? Я считаю, что ваш основной класс панели инструментов должен также реализовать HasFocusIO и вернуть true.

Эти проблемы с панелями инструментов IE были проклятием моего существования на некоторое время. Я думаю, что в конечном итоге я решил создать отдельные потоки пользовательского интерфейса и сделать мои диалоги модальными в этих потоках, что устранило кучу странных проблем. Но я думаю, что реализация HasFocusIO и TranslateAcceleratorIO должна работать именно для этого.

0

Где вы их реализуете? Трудно сказать, что у вас есть, внедряете ли вы их в свою форму или осуществляете ли вы их в своем классе подкладок?

Вам необходимо реализовать их в своей реализации DeskBand, и HasFocusIO должен возвращать true, когда в одном из ваших окон есть фокус (а не только в фокусе панели инструментов). Затем сообщения для Tab, Delete, клавиш со стрелками и т. Д. Должны быть отправлены в TranslateAcceleratorIO, также в вашем рабочем столе, и оттуда вам нужно будет передать их в свою форму.

Плагин IE plugin невероятно взломан в этом направлении.

Смежные вопросы