Síntomas

Llamadas recursivas a ventana Administrador funciones exportadas por USER32. DLL puede devolver sin realizar la operación solicitada y sin establecer un código de error. Esto suele ocurrir en aplicaciones con una jerarquía de ventana profundamente anidadas. Entre los síntomas que puede experimentar:

  • Aplicaciones con una jerarquía de ventana profundamente anidados no pueden cambiar el tamaño de ventanas secundarias correctamente cuando se cambia el tamaño de la ventana de marco. Windows se mueve o cambia el tamaño de una llamada a MoveWindow, SetWindowPos o DeferWindowPos.

  • No se propagan los mensajes de ventana para ventanas primarias o ventanas de secundarias como se esperaba. DefWindowProc no puede propagar mensajes a la ventana primaria o ventanas secundarias de la ventana que recibe el mensaje correctamente.

  • Mensajes de ventana enviados a una ventana mediante la llamada SendMessage, SendMessageTimeout o SendMessageCallback no son recibidas por la ventana especificada.

Además, las aplicaciones que lo contrario funcionan normalmente también pueden experimentar los síntomas descritos anteriormente, si se establecen enlaces de ventana WH_CALLWNDPROC o WH_CALLWNDPROCRET en los subprocesos de la aplicación que poseen las ventanas. Ganchos de ventana se pueden establecer en un subproceso concreto o en todos los subprocesos de la interfaz de usuario mediante una llamada a la función SetWindowsHookEx.

Causa

Este comportamiento es un resultado de no poder crecer la pila del núcleo, el subproceso de llamada para realizar la operación solicitada de Windows. Debido a la pila de núcleo adicional necesario en el x64 de procedimientos de manipulación entorno Windows, la pila del núcleo puede consumir a un ritmo más rápido que en un x86 exportado de entorno de Windows cuando recursiva de realizar llamadas a las funciones de administrador de ventana USER32. DLL. aunque los síntomas describen en este artículo son más probables en x64 plataformas de Windows, es posible que las llamadas recursivas a consumir la pila de un subproceso del núcleo en x86 plataformas Windows.

Resolución

Las soluciones siguientes pueden utilizarse para solucionar este problema

  1. Cambiar el tamaño de ventanas secundarias al controlar mensajes de ventana WM_WINDOWPOSCHANGED en su lugar pasar el mensaje a DefWindowProc.

  2. Cambiar el tamaño asincrónicamente ventanas secundarias cuando se cambia el tamaño de la ventana primaria en lugar de cambiar el tamaño de ventanas secundarias mientras se procesaba el WM_WINDOWPOSCHANGED o el mensaje de ventana WM_SIZE.

  3. Vuelva a diseñar la aplicación de la interfaz de usuario para reducir la profundidad de la ventana anidada.

Más información

Partes del subsistema Win32 se implementan en un controlador de dispositivo de modo de núcleo (WIN32K. (SYS). Llamadas a funciones exportadas por USER32. DLL para cambiar el estado de una ventana, incluidos su tamaño y posición, llamará en WIN32K. SYS para realizar la operación solicitada. Las funciones que modifican el estado de una ventana suele resultar en mensajes de ventana enviados a la ventana modificada, donde WIN32K. SYS hace una llamada de modo de usuario para llamar al procedimiento de ventana de la ventana que está modificando. Por ejemplo, WIN32K. SYS enviará una ventana, un mensaje de ventana WM_WINDOWPOSCHANGING y un mensaje de ventana WM_WINDOWPOSCHANGED cuando se modifica el tamaño o la posición de la ventana llamando a la función SetWindowPos. DefWindowProc enviará la ventana especificada un mensaje WM_SIZE cuando se llama con un mensaje WM_WINDOWPOSCHANGED y ha cambiado el tamaño de la ventana. Las aplicaciones suelen cambiar el tamaño de ventanas secundarias cuando la ventana primaria recibe un mensaje de ventana WM_WINDOWPOSCHANGED o WM_SIZE, lo que conduce a la realización de llamadas recursivas en WIN32K. SYS para jerarquías de varios niveles de anidamiento de ventana. Las aplicaciones que lo contrario funcionan normalmente también pueden experimentar los síntomas descritos en este artículo, cuando se establecen enlaces WH_CALLWNDPROC o WH_CALLWNDPROCRET en subprocesos del proceso. Esto se debe a que el espacio de pila adicionales del núcleo que se consumen cuando WIN32K. SYS se encarga de llamar a los procedimientos de enlace. Llamar a SendMessage para enviar un mensaje de ventana a una ventana mediante el subproceso de llamada de propiedad normalmente llamará al procedimiento de ventana de la ventana que recibe el mensaje sin tener que llamar en WIN32K. SYS. Sin embargo, en WIN32K invoca SendMessage. SYS si hay enlaces WH_CALLWNDPROC o WH_CALLWNDPROCRET los ganchos del conjunto en el subproceso de llamada, como WIN32K. SYS administra los ganchos y llamar a procedimientos de enlace de controladores. Como se mencionó anteriormente, DefWindowProc enviará la ventana especificada un mensaje WM_SIZE cuando se llama con un mensaje WM_WINDOWPOSCHANGED y ha cambiado el tamaño de la ventana. Un enlace WH_CALLWNDPROC o un WH_CALLWNDPROCRET hará que la llamada SendMessage DefWindowProc facilita la transición al modo kernel para poder llamar a los procedimientos de enlace. Cambio de tamaño de secundarios de windows cuando el tratamiento de mensajes de ventana WM_WINDOWPOSCHANGED en lugar de mensajes de ventana WM_SIZE reducirá uso de la pila del núcleo eliminando la necesidad de SendMessage para pasar al modo kernel en orden llamar a procedimientos de enlace. Los desarrolladores de aplicaciones de Windows Forms que se están encontrando este problema deben consultar de artículo KB 953934para obtener información adicional.

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¿Cómo de satisfecho está con la calidad de la traducción?
¿Qué ha afectado a tu experiencia?

¡Gracias por sus comentarios!

×