Mur*_*ski 13 c# excel vsto winforms excel-2010
我正在使用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理解它有焦点,那么每个标志都应该有效.
好的我能够使用以下代码解决问题
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您让我以全新的方式思考这个问题.
| 归档时间: |
|
| 查看次数: |
1137 次 |
| 最近记录: |