ข้ามไปที่เนื้อหาหลัก
การสนับสนุน
ลงชื่อเข้าใช้
ลงชื่อเข้าใช้ด้วย Microsoft
ลงชื่อเข้าใช้หรือสร้างบัญชี
สวัสดี
เลือกบัญชีอื่น
คุณมีหลายบัญชี
เลือกบัญชีที่คุณต้องการลงชื่อเข้าใช้

อาการ

แบบเรียกใช้ซ้ำการเรียกไปยังฟังก์ชันการจัดการหน้าต่างส่งออก โดย 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

การแก้ไข

แก้ไขปัญหาต่อไปนี้สามารถใช้เพื่อแก้ไขปัญหานี้

  1. ปรับขนาดหน้าต่างลูกเมื่อจัดการข้อความหน้าต่าง WM_WINDOWPOSCHANGED ที่แทน ส่งผ่านข้อความไป DefWindowProc

  2. ปรับขนาดหน้าต่างลูกแบบอะซิงโครนัสเมื่อมีการปรับขนาดหน้าต่างหลักแทนการปรับขนาดหน้าต่างลูกขณะประมวลผลการ WM_WINDOWPOSCHANGED หรือ WM_SIZE หน้าต่างข้อความ

  3. ออกแบบโปรแกรมประยุกต์ 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สำหรับข้อมูลเพิ่มเติม

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่

ต้องการตัวเลือกเพิ่มเติมหรือไม่

สํารวจสิทธิประโยชน์ของการสมัครใช้งาน เรียกดูหลักสูตรการฝึกอบรม เรียนรู้วิธีการรักษาความปลอดภัยอุปกรณ์ของคุณ และอื่นๆ

ชุมชนช่วยให้คุณถามและตอบคําถาม ให้คําติชม และรับฟังจากผู้เชี่ยวชาญที่มีความรู้มากมาย

ข้อมูลนี้เป็นประโยชน์หรือไม่

คุณพึงพอใจกับคุณภาพภาษาเพียงใด
สิ่งที่ส่งผลต่อประสบการณ์ใช้งานของคุณ
เมื่อกดส่ง คำติชมของคุณจะถูกใช้เพื่อปรับปรุงผลิตภัณฑ์และบริการของ Microsoft ผู้ดูแลระบบ IT ของคุณจะสามารถรวบรวมข้อมูลนี้ได้ นโยบายความเป็นส่วนตัว

ขอบคุณสำหรับคำติชมของคุณ!

×