Rekurzivna poziva na prozor menadžer funkcije možda neće uspeti neočekivano

Simptomi

Rekurzivna poziva da prozor menadžer funkcije izvezene od strane USER32. DLL datoteka može vratiti bez izvršavanja zahtevanu operaciju i bez postavljanja kôd greške. Ovo se obično događa u aplikacijama sa hijerarhijom duboko ugnežđeni prozor. Među simptome može doći do:

  • Promena veličine dete windows ispravno kada se promeni veličina okvira prozora aplikacije sa hijerarhijom duboko ugnežđeni prozor nije uspio. Windows su se preselili i/ili resized pozivom, MoveWindow, SetWindowPos ili DeferWindowPos.

  • Prozor poruke ne šire roditelj operacijskog sustava windows ili windows dete, kao što je očekivano. DefWindowProc ne može uspešno da propagira poruke na nadređeni prozor ili dete windows prozora koji prima poruku.

  • Prozor poruke šalju na prozor tako zove pošiljalac poziva, SendMessageTimeout ili SendMessageCallback nije primilo navedeni prozor.

Pored toga, aplikacije koje se inače normalno funkcionišu i iskusiti simptome opisane iznad, ako WH_CALLWNDPROC ili WH_CALLWNDPROCRET prozor kuke su podešene na niti u okviru aplikacije koje poseduju prozore. Prozor kuke može se podesiti na određenu nit ili na svim UI niti sa pozivom funkcije SetWindowsHookEx.

Uzrok

Takvo je ponašanje rezultat Windows sto ne moze da se razvija jezgra svežnju Zove nit da biste izvršili zahtevanu operaciju. Zbog dodatne jezgre steka rukovanja procedure koje su neophodne u na x64 Windows okruženje, steka jezgra može biti obuzet su brzim tempom nego u jedan x86 Windows okruženje kada pravim rekurzivna poziva na prozor funkcije menadžera izvezene USER32. DLL. iako simptome opisane u ovom članku su češće javljaju u x64 Windows platformama, moguće za Rekurzivne pozive da konzumira steka jezgra za nit na x86 Windows platforme.

Rešenje

Sledeća rešenja možete koristiti da biste rešili ovaj problem

  1. Promena veličine dete windows prilikom rukovanja WM_WINDOWPOSCHANGED prozor poruke umesto toga prenosi poruku da DefWindowProc.

  2. Asinhrono promenu veličine prozora dete kad nadređeni prozor se menja veličina umesto promena veličine dete windows prilikom obrade na WM_WINDOWPOSCHANGED ili WM_SIZE prozor poruke.

  3. Redizajn i aplikacije UI ugnežđeni prozor na dubinu periskopa.

Više informacija

Dijelovi podsistem za Win32 se sprovode u zaštićenom režimu rada upravljačkog programa za uređaj (WIN32K. SYS). Poziva funkcije izvezene od strane USER32. "DLL" promena stanja prozor, uključujući njegovu veličinu i položaj, će zvati u WIN32K. SYS da izvrši zahtevanu operaciju. Funkcije koje obično da izmenite stanje prozor rezultirati prozor poruke šalju na prozoru modificiraju, gde WIN32K. SYS čini korisnički režim oblačić da zovem prozor procedura prozora modificiraju. Na primer, WIN32K. SYS će poslati prozor WM_WINDOWPOSCHANGING prozor poruke i WM_WINDOWPOSCHANGED prozor poruke kada veličina i/ili položaj prozora će, kako se mijenjaju, poziva funkciju SetWindowPos. DefWindowProc će poslati navedeni prozor poruku "WM_SIZE" kada je zvao sa porukom WM_WINDOWPOSCHANGED i je promenjena veličina prozora. Aplikacije obično promenu veličine prozora dete kad nadređeni prozor dobije WM_WINDOWPOSCHANGED ili WM_SIZE prozor poruku, koja dovodi do Rekurzivne pozive u WIN32K. SYS za duboko ugnežđeni prozor hijerarhije. Aplikacije koje se inače normalno može doći i simptome opisane u ovom članku, kada WH_CALLWNDPROC ili WH_CALLWNDPROCRET kuke su postavljene na nitima u procesu. To je zbog dodatne jezgre steka prostor koji je utrošen kada WIN32K. SYS rukuje poziva procedure kuka. Zove pošiljalac poziva da biste poslali poruku prozor prozor u vlasništvu Zove nit će obično pozivati prozor procedura prozora koji prima poruku bez pozivanja u WIN32K. SYS. Međutim, pošiljalac poziva će zvati u WIN32K. SYS ako postoje WH_CALLWNDPROC kuke ili WH_CALLWNDPROCRET kuke skup zove konac, kao WIN32K. SYS upravlja kuke i regulatore poziva procedure kuka. Kao što je naznačeno, DefWindowProc će poslati navedeni prozor poruku "WM_SIZE" kada je zvao sa porukom WM_WINDOWPOSCHANGED i je promenjena veličina prozora. WH_CALLWNDPROC kuku ili na WH_CALLWNDPROCRET će izazvati pošiljalac poziva poziv tera DefWindowProc pretvorila u zaštićenom režimu rada kako bi se zvati kuka procedure. Menjanje veličine windows dete kad rukovanja WM_WINDOWPOSCHANGED prozor poruke umesto WM_SIZE prozor poruke će se smanjiti upotreba steka jezgra eliminisanjem za pošiljalac poziva pretvorila u zaštićenom režimu rada u redu pozvati kuka procedure. Projektanti obrazaca Windows aplikacija koje nailazite na ovaj problem bi trebalo da se odnose na KB članak 953934za dodatne informacije.

Potrebna vam je dodatna pomoć?

Unapredite veštine
Istražite obuku
Prvi nabavite nove funkcije
Pridružite se Microsoft insajdere

Da li su vam ove informacije koristile?

Hvala vam na povratnim informacijama!

Hvala za povratne informacije! Izgleda da će biti od pomoći ako vas povežemo sa našim agentima Office podrške.

×