Клавиша вкладки на панели инструментов Internet Explorer

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

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

Созданная мной панель инструментов основана на этом статья и эта статья

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

Вот мои реализации TranslateAcceleratorIO() и HasFocusIO() (реализованы в моем классе инструментов)

        [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
    }

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


person Millhouse    schedule 20.10.2008    source источник
comment
@wpfwannabe К сожалению, я не помню, решили ли мы эту конкретную проблему, и это было у моего предыдущего работодателя, поэтому я не могу посмотреть код, чтобы узнать.   -  person Millhouse    schedule 17.10.2011


Ответы (2)


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

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

person Gerald    schedule 20.10.2008

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

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

Таким образом, структура плагинов IE невероятно хакерская.

person Gerald    schedule 21.10.2008
comment
Методы, которые я опубликовал, реализованы в моем рабочем столе. Я подключил отладчик и заметил, что мой HasFocusIO() никогда не вызывается, поэтому должна быть проблема с тем, как я подключаюсь к IE. - person Millhouse; 21.10.2008