Applies ToWindows

Simptome

Recursivă apelurile către fereastra manager funcțiile exportate de USER32. DLL poate returna fără a efectua operațiunea solicitată și fără un cod de eroare. Aceasta se întâmplă de obicei în aplicațiile cu o fereastră profund imbricate ierarhie. Printre simptome pot apărea:

  • Aplicațiile cu o fereastră profund imbricate ierarhie nu reușesc să redimensionați windows fiu corect când fereastra cadru este redimensionată. Windows sunt mutate sau redimensionată apelând MoveWindow, SetWindowPos sau DeferWindowPos.

  • Mesaje de fereastră nu sunt propagate părinte windows sau windows fiu așa cum vă așteptați. DefWindowProc poate propaga cu succes mesaje la fereastra părinte sau fiu windows din fereastra primirea mesajului.

  • Fereastră mesajele trimise într-o fereastră de apelare SendMessage, SendMessageTimeout sau SendMessageCallback nu sunt primite de la fereastra specificat.

În plus, aplicațiile care altfel funcționează normal, de asemenea, pot apărea simptomele descrise mai sus, dacă WH_CALLWNDPROC sau WH_CALLWNDPROCRET fereastra racordări sunt setate în aplicația de fire care dețin windows. Fereastră racordări poate fi setată pe un anumit fir sau pe toate subiectele UI apelând funcţia SetWindowsHookEx.

Cauză

Acest comportament este rezultatul Windows nu se poate să crească stiva kernel de apelare fir pentru a efectua operația solicitată. Din cauza stiva kernel suplimentare tratarea procedurilor necesare în x64 mediul Windows, stiva kernel poate fi consumată într-un ritm mai rapid decât în x86 un mediu Windows atunci când face recursivă apelează la fereastra manager funcțiile exportate de USER32. DLL. Deși simptomele descrise în acest articol sunt mai probabil să apară în x64 platforme Windows, este posibil pentru apeluri recursivă să consume o thread stiva kernel pe x86 platforme Windows.

Rezolvare

Următoarele soluții poate fi utilizat pentru a rezolva această problemă

  1. Redimensionați fiu windows atunci când tratarea WM_WINDOWPOSCHANGED mesaje de fereastră trece în schimb mesajul DefWindowProc.

  2. Redimensionați asincron fiu windows atunci când fereastra părinte este redimensionată în loc de redimensionare fiu windows la procesarea WM_WINDOWPOSCHANGED sau WM_SIZE fereastra mesajului.

  3. Redesign aplicația interfața utilizator pentru a reduce adâncimea imbricată fereastră.

Mai multe informații

Porțiuni din subsistemul Win32 implementate într-un kernel-mode driver de dispozitiv (WIN32K. SYS). Apelări de funcții exportate de USER32. DLL pentru a modifica starea unei ferestre, inclusiv dimensiunea sa şi position, va suna în WIN32K. SYS pentru a efectua operațiunea solicitată. Funcțiile care modifică starea de o fereastră de obicei duce la fereastra mesajele trimise la fereastra fiind modificate, în cazul în care WIN32K. SYS face o explicație modului de utilizator pentru a apela procedura de fereastră din fereastra fiind modificate. De exemplu, WIN32K. SYS va trimite o fereastră mesajul WM_WINDOWPOSCHANGING fereastră și un mesaj de fereastră WM_WINDOWPOSCHANGED când dimensiunea sau poziția fereastra sunt modificate de apelare funcția SetWindowPos. DefWindowProc va trimite fereastra specificat un mesaj WM_SIZE când numit cu un mesaj WM_WINDOWPOSCHANGED și dimensiunea ferestrei s-a modificat. Aplicații de obicei redimensionați fiu windows când fereastra părinte primește un mesaj de fereastră WM_WINDOWPOSCHANGED sau WM_SIZE, care duce la efectuarea de apeluri recursivă în WIN32K. SYS pentru fereastra profund imbricate ierarhii. Aplicațiile care funcționează în caz contrar în mod normal, de asemenea, pot apărea simptomele descrise în acest articol atunci când WH_CALLWNDPROC sau WH_CALLWNDPROCRET racordări sunt setate în procesul de fire. Acest lucru se datorează spațiul stiva kernel suplimentare care este consumată atunci când WIN32K. SYS tratează cârlig procedurile de apelare. Apelarea SendMessage pentru a trimite un mesaj fereastră pentru o fereastră de apelare firul de obicei va suna procedura de fereastră din fereastra primesc mesajul fără a trebui să apelați la WIN32K. SYS. Cu toate acestea, SendMessage va suna în WIN32K. SYS dacă există WH_CALLWNDPROC racordări sau WH_CALLWNDPROCRET cârlige set conversație apelante, ca WIN32K. SYS gestionează racordări şi tratează apelarea cârlig proceduri. Ca menționate mai sus, DefWindowProc va trimite fereastra specificat un mesaj WM_SIZE când numit cu un mesaj WM_WINDOWPOSCHANGED și dimensiunea ferestrei s-a modificat. Un cârlig WH_CALLWNDPROC sau o WH_CALLWNDPROCRET va provoca apelul SendMessage DefWindowProc face să facă trecerea în modul kernel pentru a apela procedurile cârlig. Redimensionare windows fiu când tratarea WM_WINDOWPOSCHANGED mesaje de fereastră în loc de mesaje de fereastră WM_SIZE va reduce utilizarea de stiva kernel eliminând nevoia de SendMessage se face trecerea în modul kernel în ordine apelează cârlig proceduri. Dezvoltatorii de aplicații Windows Forms care întâmpină această problemă ar trebui să consultaţi KB articol 953934pentru informații suplimentare.

Aveți nevoie de ajutor suplimentar?

Doriți mai multe opțiuni?

Explorați avantajele abonamentului, navigați prin cursurile de instruire, aflați cum să vă securizați dispozitivul și multe altele.

Comunitățile vă ajută să adresați întrebări și să răspundeți la întrebări, să oferiți feedback și să primiți feedback de la experți cu cunoștințe bogate.