Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

366
Views
Excel CustomTaskPane con control WebBrowser: problemas de teclado/enfoque

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.

ingrese la descripción de la imagen aquí

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.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!