Клавиша вкладки панели инструментов Internet Explorer - PullRequest
3 голосов
/ 21 октября 2008

Я написал панель инструментов IE на C #, и все работает нормально, за исключением того, что когда я открываю дочернюю форму 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
    }

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

Ответы [ 2 ]

1 голос
/ 21 октября 2008

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

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

0 голосов
/ 21 октября 2008

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

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

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

...