Tengo este problema exacto https://social.msdn.microsoft.com/Forums/vstudio/en-US/e417e686-032c-4324-b778-fef66c7687cd/excel-customtaskpane-with-webbrowser-control-keyboardfocus-issues? foro=vsto
También se menciona aquí https://connect.microsoft.com/VisualStudio/feedback/details/521465/the-focus-issue- between-excel-cells-and-excel-customtaskpane-with-webbrowser-control
Estoy escribiendo un complemento de Excel 2010 usando Visual Studio Professional 2013. He creado un CustomTaskPane simple con un sistema secundario System.Windows.Forms.WebBrowser que lo presenta. El complemento funciona bien y puedo navegar dentro del navegador web haciendo clic y cambiando el estado de las casillas de verificación.

Cuando hago clic en un cuadro de texto de entrada, obtengo el foco y veo que el cursor parpadea, pero cuando empiezo a escribir, el texto se envía a Excel y se escribe en una celda en lugar del cuadro de texto dentro del navegador.
Agrego el panel de tareas personalizado cuando se carga la cinta.
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; } Cuando hago clic en el cuadro de texto y luego presiono F6 , funciona correctamente. El encabezado del panel de tareas personalizado se oscurece ligeramente y el texto se captura en el cuadro de texto.
¿Cómo puedo solucionar este problema para que cuando haga clic en el cuadro de texto de entrada, el texto entre en el cuadro en lugar de Excel?
EDITAR: Ok, hice algunas pruebas más. Si agrego eventos en mi TaskPaneView para rastrear el mouse, ingrese y haga clic en ellos funcionan, pero solo si elimino el niño del navegador web. Lo que significa que el navegador web de alguna manera bloquea estos eventos y evita que TaskPaneView entienda que tiene el foco. Si también agregué un control de formulario de cuadro de texto en TaskPaneView junto con el navegador, el cuadro de texto funciona totalmente bien y TaskPaneView entiende que tiene foco y luego el campo de texto de entrada dentro del navegador comienza a funcionar. Si llamo al método de enfoque directamente en el navegador web, TaskPaneView entiende que tiene el foco y todo funciona perfectamente. Claramente, el problema no es realmente con el teclado, sino un problema de que no se le dice a TaskPaneView que tiene el foco cuando se hace clic en el navegador, por lo que las pulsaciones de teclas van al área incorrecta. Si puedo encontrar una manera de hacer que TaskPaneView entienda que tiene enfoque, todo debería funcionar.
Ok, pude solucionar el problema usando el siguiente código
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); }Agregué esta función a mi TaskPaneView, que es simplemente un UserControl con ese navegador web secundario. No tengo una comprensión profunda de por qué o cómo funciona esto, pero básicamente creo que lo que sucede es que estoy interceptando WndProc, que es una función de bajo nivel que procesa los mensajes enviados a la ventana. Lo uso para comprobar si el mensaje es 528, que creo que significa notificar a los padres. No sé si este es exactamente el mensaje que debo escuchar, pero parece funcionar.
Una vez que tengo el mensaje de mensaje correcto, verifico si TaskPaneView tiene el foco y, si no, lo enfoco con la función focus() . Hice pruebas anteriormente que mostraban que si invocaba manualmente el focus en TaskPaneView, todo funcionaba bien. Entonces, si no tengo enfoque, entonces solicito enfoque manualmente y todos estamos bien.
Agradecería si alguien puede proporcionar una explicación más detallada de por qué esto funciona para que pueda entenderlo mejor, pero al menos resolví el problema. Gracias Jeremy Thompson por hacerme pensar sobre este tema de una manera nueva.
P: Proporcione una explicación más detallada de por qué esto funciona para que pueda entenderlo mejor.
¡Me alegro de que lo hayas hecho funcionar! Para realizar un análisis de causa raíz, necesitaríamos ver dónde se envía ese mensaje 528 y necesitaríamos el código fuente de Microsoft Excel para hacerlo.
No creo que valga la pena dedicar más tiempo a solucionarlo o averiguar por qué sucede porque ¡ES UN ERROR! Registrar un error de Connect para ayudar a Microsoft a solucionarlo es lo mejor que puede hacer. Solo podemos solucionarlo, es un problema en su código fuente.
Es bastante raro que encuentre estos escenarios en VSTO para ver errores y ciertamente ha encontrado uno; donde un usuario ingresa la entrada de texto en un cuadro de texto de Complementos y el mensaje fluye a una celda en la hoja de trabajo. En mi situación; donde el mensaje no se envió al evento Calendars_SelectedChange() . Entonces podemos ver un poco de un tema del comportamiento que se forma aquí que Hans explica bien (Citando de las preguntas y respuestas a las que me vinculé en mi comentario) :
Lo que nunca deja de ser un problema (es decir, a menudo puede ser problemático) es que confía en la bomba de mensajes en Excel para enviar mensajes de Windows, los mensajes que hacen que estos controles respondan a la entrada. Esto funciona mal tanto en WPF como en Winforms, tienen su propio ciclo de envío que filtra los mensajes antes de que se envíen a la ventana. Las cosas clave que salen mal cuando no se usa su despachador respectivo son cosas como tabulación y atajos de teclado .
Y luego, este tipo de problema sería inducido por Excel haciendo su propio filtrado antes de enviar mensajes. Supongo que en una función antimalware, Microsoft siempre está preocupado por los programas que interfieren con las aplicaciones de Office.
Y no olvide el caso de VSTO WPF Connect con el menú que no recibe eventos de clic . La solución implicó el uso de DispatcherFrame para bombear mensajes y suscribirse a GotFocusEvent y LostFocusEvent para el menú.
Entonces, el error tiene que ver con los controles que responden a la entrada y los void WndProc(ref Message m) se filtran o redirigen incorrectamente en el ciclo de envío.