3

我用 C# 编写了一个 IE 工具栏,一切正常,除了当我从工具栏打开一个子 Windows 窗体时,tab 键在子窗体上不起作用,无法让我从一个字段移动到另一个字段。

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

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

4

2 回答 2

1

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

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

于 2008-10-20T21:29:23.243 回答
0

你在哪里实施这些?很难从你那里有什么来判断,你是在你的表单中实现它们还是在你的桌带类中实现它们?

您需要在 DeskBand 实现中实现它们,并且 HasFocusIO 需要在您的一个窗口具有焦点时返回 true(而不仅仅是在工具栏具有焦点时)。然后,Tab、Delete、箭头键等的消息应该发送到 TranslateAcceleratorIO,也在您的桌带中,然后您必须从那里将它们传递给您的表单。

IE 插件框架以这种方式令人难以置信。

于 2008-10-21T15:31:26.757 回答