อาการ
แบบเรียกใช้ซ้ำการเรียกไปยังฟังก์ชันการจัดการหน้าต่างส่งออก โดย USER32 DLL อาจส่งคืน โดยไม่มีการดำเนินการที่ร้องขอนี้ และไม่ มีการตั้งค่ารหัสข้อผิดพลาด ในกรณีนี้ในแอพลิเคชันมีลำดับชั้นหน้าต่างที่ซ้อนกันหลายชั้น ระหว่างอาการต่าง ๆ อาจพบ:
-
แอพลิเคชัน มีลำดับชั้นแบบซ้อนกันหลายชั้นหน้าต่างล้มเหลวเพื่อปรับขนาดหน้าต่างลูกอย่างถูกต้องเมื่อถูกเปลี่ยนขนาดหน้าต่างเฟรม Windows จะย้าย / ปรับขนาด โดยการโทรหา MoveWindow, SetWindowPos หรือ DeferWindowPos
-
ข้อความหน้าต่างจะไม่เผยแพร่ windows หลัก หรือรอง windows ตามที่คาดไว้ DefWindowProc อาจเผยแพร่ข้อความไปยังหน้าต่างหลักหน้าต่างลูกของหน้าต่างจะได้รับข้อความเสร็จเรียบร้อยแล้ว
-
หน้าต่างส่งข้อความไปยังหน้าต่างโดยเรียก SendMessage, SendMessageTimeout หรือ SendMessageCallback ไม่ได้รับตามที่ระบุ
นอกจากนี้ แอพลิเคชันที่ไม่ ปกติอาจยังพบอาการตามที่อธิบายไว้ข้างต้นถ้ามีตั้ง WH_CALLWNDPROC หรือ WH_CALLWNDPROCRET หน้าต่าง hooks บนเธรดในแอพลิเคชันที่เป็นเจ้าของ windows หน้าต่าง hooks สามารถตั้ง บนเธรดเฉพาะ หรือ บนเธรด UI ทั้งหมด โดยการเรียกฟังก์ชัน SetWindowsHookEx
สาเหตุ
ลักษณะการทำงานนี้คือ ผลลัพธ์ของ Windows การไม่เกินสแตกเคอร์เนลของเธรดเรียกเพื่อที่จะดำเนินการตามร้องขอ เนื่องจากการกองซ้อนของเคอร์เนลเพิ่มเติมการจัดการขั้นตอนที่จำเป็นในการ x64 สภาพแวดล้อม Windows จะใช้สแตกเคอร์เนลที่อัตราเร็วกว่าใน x86 มีสภาพแวดล้อมของ Windows เมื่อทำซ้ำเรียกไปยังฟังก์ชันการจัดการหน้าต่างส่งออกได้ โดย USER32 ได้ DLL แม้ว่าอาการอธิบายไว้ในบทความนี้มักจะเกิดขึ้นใน x64 แพลตฟอร์ม Windows อาจเป็นไปได้สำหรับการโทรศัพท์แบบเรียกใช้ซ้ำจะใช้สแตกเคอร์เนลของเธรดบน x86 แพลตฟอร์ม Windows
การแก้ไข
แก้ไขปัญหาต่อไปนี้สามารถใช้เพื่อแก้ไขปัญหานี้
-
ปรับขนาดหน้าต่างลูกเมื่อจัดการข้อความหน้าต่าง WM_WINDOWPOSCHANGED ที่แทน ส่งผ่านข้อความไป DefWindowProc
-
ปรับขนาดหน้าต่างลูกแบบอะซิงโครนัสเมื่อมีการปรับขนาดหน้าต่างหลักแทนการปรับขนาดหน้าต่างลูกขณะประมวลผลการ WM_WINDOWPOSCHANGED หรือ WM_SIZE หน้าต่างข้อความ
-
ออกแบบโปรแกรมประยุกต์ UI เพื่อลดความลึกของหน้าต่างที่ซ้อนกัน
ข้อมูลเพิ่มเติม
ส่วนต่าง ๆ ของระบบย่อย Win32 ถูกนำไปใช้ในโหมดเคอร์เนลไดรเวอร์อุปกรณ์ (WIN32K SYS) การเรียกไปยังฟังก์ชันการส่งออก โดย USER32 DLL การเปลี่ยนสถานะของหน้าต่าง รวมทั้งตำแหน่งขนาดและตำแหน่ง จะเรียกไปยัง WIN32K SYS เพื่อดำเนินการตามร้องขอ ฟังก์ชันที่สามารถปรับเปลี่ยนสถานะของหน้าต่างโดยทั่วไปมีผลในหน้าต่างข้อความที่ถูกส่งไปยังหน้าต่างที่ถูกปรับเปลี่ยน ที่ WIN32K SYS ทำคำบรรยายภาพของโหมดผู้ใช้การเรียกกระบวนงานหน้าต่างของหน้าต่างที่ถูกปรับเปลี่ยน ตัวอย่างเช่น WIN32K SYS จะส่งหน้าต่างข้อความหน้าต่าง WM_WINDOWPOSCHANGING และ WM_WINDOWPOSCHANGED หน้าต่างข้อความเมื่อมีการปรับเปลี่ยนขนาดและ/หรือตำแหน่งของหน้าต่าง โดยเรียกฟังก์ชัน SetWindowPos DefWindowProc จะส่งหน้าต่างที่ระบุข้อความ WM_SIZE เมื่อเรียก ด้วยข้อความ WM_WINDOWPOSCHANGED และมีการเปลี่ยนแปลงขนาดของหน้าต่าง แอพลิเคชันปรับขนาดลูก windows โดยปกติเมื่อหน้าต่างหลักได้รับ WM_WINDOWPOSCHANGED หรือ WM_SIZE หน้าต่างข้อความ ซึ่งนำไปโทรศัพท์แบบเรียกใช้ซ้ำลงใน WIN32K SYS สำหรับลำดับชั้นของหน้าต่างที่ซ้อนกันหลายชั้น โปรแกรมประยุกต์ที่ไม่ ปกติอาจยังพบอาการตามที่อธิบายไว้ในบทความนี้เมื่อมีกำหนด WH_CALLWNDPROC หรือ WH_CALLWNDPROCRET hooks บนเธรดในกระบวนการ นี่คือเนื่องจาก มีเนื้อที่กองซ้อนเคอร์เนลเพิ่มเติมที่จะใช้เมื่อ WIN32K SYS จัดการการเรียกขั้นตอนของ hook เรียก SendMessage เพื่อส่งข้อความหน้าต่างไปยังหน้าต่างที่เป็นเจ้าของเธรดเรียกโดยทั่วไปจะเรียกกระบวนงานหน้าต่างของหน้าต่างจะได้รับข้อความ โดยไม่ต้องเรียกเป็น WIN32K SYS อย่างไรก็ตาม SendMessage จะเรียกไปยัง WIN32K SYS ถ้ามี WH_CALLWNDPROC hooks หรือ WH_CALLWNDPROCRET hooks ชุดบนเธรดเรียก เป็น WIN32K SYS จัดการ hooks และที่จับสำหรับการเรียกขั้นตอนของ hook ตามที่ระบุไว้ข้างต้น DefWindowProc จะส่งหน้าต่างที่ระบุข้อความ WM_SIZE เมื่อเรียก ด้วยข้อความ WM_WINDOWPOSCHANGED และมีการเปลี่ยนแปลงขนาดของหน้าต่าง จุดเชื่อมต่อ WH_CALLWNDPROC หรือ WH_CALLWNDPROCRET จะทำให้เกิดการโทร SendMessage ทำให้ DefWindowProc สามารถเปลี่ยนเป็นโหมดเคอร์เนลในการเรียกขั้นตอนของ hook ปรับขนาดหน้าต่างลูกเมื่อจัดการข้อความหน้าต่าง WM_WINDOWPOSCHANGED แทนที่เป็นข้อความในหน้าต่าง WM_SIZE จะลดการใช้สแตกเคอร์เนล โดยไม่จำเป็นสำหรับ SendMessage เพื่อเปลี่ยนเป็นโหมดเคอร์เนลในใบสั่งในการเรียกขั้นตอนของ hook นักพัฒนาแอพลิเคชันของ Windows Forms ที่กำลังพบกับปัญหานี้ควรอ้างอิงถึงบทความ KB 953934สำหรับข้อมูลเพิ่มเติม