Internet Explorer 工具栏 Tab 键

3
我用C#编写了IE工具栏,除了当我从我的工具栏打开一个子窗体时,标签键无法在子窗体上正常工作以允许我从一个字段移动到另一个字段之外,一切都很好。
有趣的是,当我使用form.showDialog()而不是form.show()来打开我的子窗体时,标签可以像平常一样工作。
我创建的工具栏基于这篇文章article和这篇文章article 我已经按照几篇文章中提到的实现了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
    }

有其他人遇到过这个问题吗?


@wpfwannabe 很抱歉,我不记得我们是否解决了那个特定的问题,而且这是在我的前任雇主,所以我无法查看代码找出答案。 - Millhouse
2个回答

1
你也在实现HasFocusIO吗?我认为你的主工具栏类必须也要实现HasFocusIO并返回true。
针对IE工具栏的这些问题曾经令我苦恼了一段时间。我最终做的是创建单独的UI线程,并使我的对话框在那些线程中成为模态的,这消除了很多奇怪的问题。但是我认为实现HasFocusIO和TranslateAcceleratorIO应该可以解决这个特定的问题。

0
你是在哪里实现这些功能的?从你提供的信息中很难看出来,你是在表单中实现还是在你的桌面工具栏类中实现?
你需要在你的DeskBand实现中实现它们,并且当你的窗口有焦点时(不仅仅是工具栏有焦点时),HasFocusIO需要返回true。然后,Tab、Delete、箭头键等消息应该被分派到TranslateAcceleratorIO中,在那里你将不得不将它们传递给你的表单。
IE插件框架在这方面非常混乱。

我发布的方法是在我的桌面边栏中实现的。我连接了调试器,发现我的HasFocusIO()从未被调用过,所以我必须检查一下我钩入IE的方式是否有问题。 - Millhouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接