Преминаване към основното съдържание
Поддръжка
Влизане с Microsoft
Влезте или създайте акаунт.
Здравейте,
Изберете друг акаунт.
Имате няколко акаунта
Изберете акаунта, с който искате да влезете.

Симптоми

Рекурсивна повиквания за функциите на диспечера на прозореца, изнасяни от 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. Системи за изпълнение на исканата операция. Функции, които променят състоянието на Прозорец обикновено води до прозореца съобщения, изпратени в прозореца се променят, когато WIN32K. SYS прави потребителски режим покана да се обадя прозореца процедура на прозореца се променят. Например WIN32K. SYS ще изпрати прозорец WM_WINDOWPOSCHANGING прозорец и WM_WINDOWPOSCHANGED прозорец съобщение при размер и/или позицията на прозореца са променени чрез извикване на функцията SetWindowPos. DefWindowProc ще изпрати указаната прозореца WM_SIZE съобщение, когато се нарича WM_WINDOWPOSCHANGED съобщение и размера на прозореца е променен. Приложенията обикновено се преоразмерява дъщерен прозорец, когато главния прозорец получава WM_WINDOWPOSCHANGED или WM_SIZE прозорец съобщение, което води до рекурсивна повиквания в WIN32K. Системи за дълбоко загнезден прозорец йерархии. Приложения, които иначе функционира нормално може да опита симптомите, описани в тази статия при WH_CALLWNDPROC или WH_CALLWNDPROCRET проследяване на теми в този процес. Това се дължи на допълнителни ядрото стека пространство, когато консумират WIN32K. SYS обработва извикване на процедури за закачване. Обаждане SendMessage да изпратите съобщение прозорец прозорец собственост на нишката за повикване обикновено изисква процедура на прозореца на прозореца на получаване на съобщение без да се налага да WIN32K. SYS. Обаче SendMessage ще постави под WIN32K. SYS, ако има WH_CALLWNDPROC проследяване или WH_CALLWNDPROCRET куки набор на нишката за повикване, като WIN32K. SYS управлява проследяване и обработва извикване на процедури за закачване. Както беше отбелязано по-горе, DefWindowProc ще изпрати указаната прозореца WM_SIZE съобщение, когато се нарича WM_WINDOWPOSCHANGED съобщение и размера на прозореца е променен. Закачване на WH_CALLWNDPROC или WH_CALLWNDPROCRET ще предизвика SendMessage покана DefWindowProc кара да премине в режим на ядрото за повикване на процедури за закачване. Преоразмеряване дъщерен прозорец при обработка на съобщения в прозорци WM_WINDOWPOSCHANGED вместо WM_SIZE прозореца съобщения ще намали използване на стека на ядрото чрез премахване на необходимостта от SendMessage да премине в режим на ядрото с цел покана закачване процедури. Разработчиците на Windows Forms приложения, които се натъкват на този въпрос трябва да се отнася за KB член 953934за допълнителна информация.

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.

Общностите ви помагат да задавате и отговаряте на въпроси, да давате обратна връзка и да получавате информация от експерти с богати знания.

Беше ли полезна тази информация?

Доколко сте доволни от качеството на езика?
Какво е повлияло на вашия потребителски опит?
Като натиснете „Подаване“, вашата обратна връзка ще се използва за подобряване на продуктите и услугите на Microsoft. Вашият ИТ администратор ще може да събира тези данни. Декларация за поверителност.

Благодарим ви за обратната връзка!

×