带有WebBrowser控件的Excel CustomTaskPane - 键盘/焦点问题

Mur*_*ski 13 c# excel vsto winforms excel-2010

我有这个问题https://social.msdn.microsoft.com/Forums/vstudio/en-US/e417e686-032c-4324-b778-fef66c7687cd/excel-customtaskpane-with-webbrowser-control-keyboardfocus-issues?论坛= VSTO

这里也提到https://connect.microsoft.com/VisualStudio/feedback/details/521465/the-focus-issue-between-excel-cells-and-excel-customtaskpane-with-webbrowser-control

我正在使用Visual Studio Professional 2013编写Excel 2010插件.我创建了一个简单的CustomTaskPane,其中包含一个System.Windows.Forms.WebBrowser子文件.该插件工作正常,我可以通过单击并更改复选框的状态在Web浏览器内导航.

在此输入图像描述

当我点击输入文本框时,我得到焦点,我看到光标闪烁,但是当我开始输入时,文本被发送到Excel并写入单元格而不是浏览器中的文本框.

我在功能区加载时添加自定义任务窗格.

private void Ribbon_Load(object sender, RibbonUIEventArgs e)
{
  TaskPaneView taskPaneView = new TaskPaneView();
  Microsoft.Office.Tools.CustomTaskPane myTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, "Title");
  myTaskPane.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)

当我点击文本框然后点击F6它正常工作.customtaskpane标题稍微变暗,文本框中会捕获文本.

我如何解决这个问题,以便当我点击输入文本框时,文本进入框而不是Excel?

编辑:好的,我做了一些测试. 如果我在TaskPaneView上添加事件以跟踪鼠标输入并单击它们可以正常工作,但前提是我删除了Web浏览器子项.这意味着Web浏览器以某种方式阻止这些事件并阻止TaskPaneView理解它具有焦点.如果我还在浏览器旁边的TaskPaneView中添加了一个文本框表单控件,文本框工作正常,TaskPaneView理解它有焦点,然后浏览器中的输入文本字段开始工作.如果我直接在Web浏览器上调用焦点方法,则TaskPaneView会理解它具有焦点并且一切正常.很明显,问题不在于键盘问题,而是在点击浏览器时没有告诉它有问题的TaskPaneView问题,因此击键会转到错误的区域.如果我能找到一种方法让TaskPaneView理解它有焦点,那么每个标志都应该有效.

Mur*_*ski 8

好的我能够使用以下代码解决问题

protected override void WndProc(ref Message m)
{
  const int WM_PARENTNOTIFY = 528;
  if(m.Msg == WM_PARENTNOTIFY && !this.Focused)
  {
    this.Focus();
  }
  base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)

我将此函数添加到我的TaskPaneView,它只是一个带有该webbrowser子元素的UserControl.我没有深入理解为什么或如何工作,但基本上我认为发生的事情是我正在拦截WndProc,这是一个处理发送到窗口的消息的低级函数.我用它来检查消息是否是528,我认为这意味着notifyParent.我不知道这是否应该是我应该收听的消息,但它似乎有效.

一旦我有正确的消息消息,我检查以查看TaskPaneView是否具有焦点,如果没有,我将其重点放在该focus()功能上.我之前做过测试,显示我是否focus在TaskPaneView上手动调用一切正常.所以,如果我没有焦点,那么手动请求焦点,我们都很好.

如果有人可以提供更详细的解释,为什么这样可行,以便我能更好地理解它,我将不胜感激,但至少我解决了这个问题.感谢Jeremy Thompson您让我以全新的方式思考这个问题.

  • 搜索了几天,并尝试了各种不成功的修复(包括令人印象深刻的globalmousekeyhook库@ https://github.com/gmamaladze/globalmousekeyhook),但没有什么比这更令人印象深刻.它就像一个魅力.万分感谢. (2认同)