Перейти до основного
Підтримка
Вхід
Вхід за допомогою облікового запису Microsoft
Увійдіть або створіть обліковий запис.
Вітаємо,
Виберіть інший обліковий запис.
У вас є кілька облікових записів
Виберіть обліковий запис, за допомогою якого потрібно ввійти.

Ознаки

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

  • Застосунки з ієрархією глибоко вкладені вікна не змінити розмір дочірнього вікна належним чином під час змінення рамка вікна. Windows переміщено, або під час, зателефонувавши за номером MoveWindow, та або 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 вікно повідомлення під час шляхом виклику функції та змінення розміру та/або розташування вікна. DefWindowProc буде надіслано до вказаного вікна WM_SIZE повідомлення, коли WM_WINDOWPOSCHANGED повідомлення, і розмір вікна було змінено. Програми зазвичай розмір дочірнього вікна під час батьківського вікна, отримує WM_WINDOWPOSCHANGED або WM_SIZE вікно повідомлення, що призводить до дзвінків рекурсивний в WIN32K. SYS глибоко вкладені вікна ієрархії. Застосунки, які в іншому разі функція зазвичай виникають проблеми, описані в цій статті, під час 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 додатків, що ця проблема виникає, слід звернутися до статті бази Знань 953934за додатковою інформацією.

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.

Спільноти допомагають ставити запитання й відповідати на них, надавати відгуки та дізнаватися думки висококваліфікованих експертів.

Чи ця інформація була корисною?

Наскільки ви задоволені якістю мови?
Що вплинуло на ваші враження?
Натиснувши кнопку "Надіслати", ви надасте свій відгук для покращення продуктів і служб Microsoft. Ваш ІТ-адміністратор зможе збирати ці дані. Декларація про конфіденційність.

Дякуємо за відгук!

×