Проблемы

Рекурсивных вызовов в окне Диспетчер функций, экспортируемых из USER32. Библиотека DLL может возвращать без выполнения запрошенной операции и установки кода ошибки. Обычно это происходит в приложениях с глубоким окна иерархии. Среди симптомы могут возникнуть.

  • Приложения с иерархией глубоко вложенные окна не правильному изменению размеров дочерних окон при изменении размера фрейма окна. Windows перемещение и изменение размеров путем вызова функции MoveWindow, SetWindowPos интерфейса или DeferWindowPos.

  • Окно сообщения не распространяются windows родительских или дочерних окон, как ожидалось. DefWindowProc не может распространять сообщения родительского окна и дочерние окна в окне сообщения.

  • Окно сообщения отправляются в окно путем вызова SendMessage, SendMessageTimeout или SendMessageCallback не доходят до указанного окна.

Кроме того приложения, которые в противном случае работать нормально также наблюдаются симптомы, описанные выше, если WH_CALLWNDPROC или WH_CALLWNDPROCRET окна ловушки устанавливаются на потоки в приложении, владеющие windows. Обработчики окна можно задать на конкретный поток или все потоки пользовательского интерфейса с помощью вызова функции SetWindowsHookEx.

Причина

Это поведение возникает в результате Windows не сможет увеличить стек ядра вызывающего потока для выполнения запрошенной операции. Из-за необходимости в x64 процедуры обработки стек дополнительные ядра среды Windows, стек ядра могут быть использованы в более быстром темпе, чем в x86 среде Windows после внесения рекурсивные вызовы функций диспетчера окна экспорта USER32. DLL. Несмотря на то, что в этой статье описаны симптомы более вероятны в x64 платформ Windows, возможно, рекурсивные вызовы для использования ядра стек потока на x86 платформ Windows.

Решение

Для временного решения этой проблемы можно использовать следующие решения

  1. При обработке сообщения окна WM_WINDOWPOSCHANGED вместо передачи сообщения DefWindowProc изменение размеров дочерних окон.

  2. При изменении размера родительского окна вместо изменения размеров дочерних окон при обработке WM_WINDOWPOSCHANGED или окно сообщения WM_SIZE асинхронно размер дочерних окон.

  3. Переделайте дизайн пользовательского интерфейса приложения для уменьшения глубины вложенного окна.

Дополнительная информация

Часть подсистемы Win32, реализуются в режиме ядра драйвера устройства (инструкции WIN32K. SYS). Вызовы функций, экспортируемых из USER32. DLL, чтобы изменить состояние окна, включая его размер и положение, приводит к вызову инструкции WIN32K. SYS для выполнения запрошенной операции. Функции, которые обычно изменяют состояние окна привести в окне сообщения, отправляемые в окно изменения, где инструкции WIN32K. SYS делает выноски пользовательского режима для вызова процедуры окна окна изменяется. Например, инструкции WIN32K. SYS отправит окно сообщение окна WM_WINDOWPOSCHANGING и WM_WINDOWPOSCHANGED окно сообщения при изменении размера или положения окна путем вызова функция SetWindowPos интерфейса. DefWindowProc будет отправлять заданное окно сообщения WM_SIZE вызван с сообщением WM_WINDOWPOSCHANGED и изменении размеров окна. Приложения обычно изменение размеров дочерних окон при получении WM_WINDOWPOSCHANGED или WM_SIZE окна сообщения, которое приводит к рекурсивных вызовов в инструкции WIN32K родительского окна. SYS для глубоко вложенных окна иерархии. Приложения, которые в противном случае работать нормально также могут возникнуть проблемы, описанные в этой статье, при WH_CALLWNDPROC или WH_CALLWNDPROCRET ловушки устанавливаются на потоки в процессе. Это происходит из-за дополнительных ядра стекового пространства, когда потребляется инструкции WIN32K. SYS обрабатывает вызов процедур обработки. Вызвав метод SendMessage для отправки сообщения окна окно принадлежит вызывающему потоку будет вызывать процедуру окна окна сообщения без вызова в инструкции WIN32K. SYS. Тем не менее в инструкции WIN32K будет вызывать SendMessage. SYS при наличии ловушки WH_CALLWNDPROC или WH_CALLWNDPROCRET в инструкции WIN32K подключает набор в вызывающем потоке. SYS управляет ловушки и обрабатывает вызов процедур обработки. Как отмечалось выше, DefWindowProc отправляет указанное окно сообщение WM_SIZE при вызове с сообщением WM_WINDOWPOSCHANGED и изменен размер окна. Ловушка WH_CALLWNDPROC или WH_CALLWNDPROCRET вызовет вызовов SendMessage DefWindowProc облегчает переход в режим ядра для вызова процедуры обработки. Изменение размеров дочерних окон при обработке сообщений окна WM_WINDOWPOSCHANGED вместо окна сообщения WM_SIZE, устраняя необходимость SendMessage для перехода в режим ядра в порядке сократить использование стека ядра вызова процедур обработки. В статье KB 953934для получения дополнительных сведений следует руководствоваться разработчиков приложений Windows Forms, в которых наблюдается данная проблема.

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?

Спасибо за ваш отзыв!

×