Internet Explorer工具栏选项卡键

时间:2008-10-20 20:52:52

标签: c# .net internet-explorer interop toolbar

我在C#中编写了一个IE工具栏,一切正常,但是当我从工具栏中打开一个子Windows窗体时,Tab键在子窗体上不起作用,允许我从一个字段移动到另一个字段

有趣的是,当我使用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
    }

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

2 个答案:

答案 0 :(得分:1)

您是否也在实施HasFocusIO?我相信你的主工具栏类也必须实现HasFocusIO并返回true。

IE工具栏的这些类型的问题是我存在一段时间的祸根。我认为我最终做的是创建单独的UI线程并在这些线程中使我的对话框模态化,这消除了一堆奇怪的问题。但我认为实现HasFocusIO和TranslateAcceleratorIO应该适用于这个特定的。

答案 1 :(得分:0)

你在哪里实施这些?很难说你在那里有什么,你是在表格中实现它们还是在桌面课程中实现它们?

您需要在DeskBand实现中实现它们,并且只要您的某个窗口具有焦点(而不仅仅是工具栏具有焦点),HasFocusIO才需要返回true。然后,Tab,Delete,箭头键等消息应该发送到TranslateAcceleratorIO,也可以在你的桌面上,然后你必须将它们传递给你的表格。

IE插件框架非常难以理解。