我在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
}
还有其他人遇到过这个问题吗?
答案 0 :(得分:1)
您是否也在实施HasFocusIO?我相信你的主工具栏类也必须实现HasFocusIO并返回true。
IE工具栏的这些类型的问题是我存在一段时间的祸根。我认为我最终做的是创建单独的UI线程并在这些线程中使我的对话框模态化,这消除了一堆奇怪的问题。但我认为实现HasFocusIO和TranslateAcceleratorIO应该适用于这个特定的。
答案 1 :(得分:0)
你在哪里实施这些?很难说你在那里有什么,你是在表格中实现它们还是在桌面课程中实现它们?
您需要在DeskBand实现中实现它们,并且只要您的某个窗口具有焦点(而不仅仅是工具栏具有焦点),HasFocusIO才需要返回true。然后,Tab,Delete,箭头键等消息应该发送到TranslateAcceleratorIO,也可以在你的桌面上,然后你必须将它们传递给你的表格。
IE插件框架非常难以理解。