आवर्ती कॉल विंडो प्रबंधक फ़ंक्शंस अनपेक्षित रूप से विफल हो सकता है

लागू: Windows

लक्षण


आवर्ती कॉल विंडो प्रबंधक फ़ंक्शन द्वारा USER32 निर्यात करने के लिए। DLL बिना अनुरोध की गई कार्रवाई कर रहा है और बिना किसी त्रुटि कोड सेट दे सकता है। यह सामान्यतया में अनुप्रयोग विंडो गहराई तक नेस्टेड पदानुक्रम के साथ आता है। आप के बीच लक्षण अनुभव कर सकते हैं:
  • अनुप्रयोग विंडो गहराई तक नेस्टेड पदानुक्रम के साथ फ्रेम विंडो का आकार बदला है, तो चाइल्ड windows सही आकार बदलने के लिए विफल। Windows हैं ले जाए और/या MoveWindow, SetWindowPos, या DeferWindowPos पर कॉल करके आकार बदला।
  • पैरेंट windows या अपेक्षा के अनुरूप चाइल्ड windows के लिए विंडो संदेश प्रचारित नहीं हैं। DefWindowProc पैरेंट विंडो या चाइल्ड विंडो प्राप्त संदेश विंडो के लिए संदेश सफलतापूर्वक प्रोपेगेट नहीं हो सकता है।
  • विंडो संदेश भेजा करने के लिए कोई विंडो द्वारा कॉलिंग SendMessage, SendMessageTimeout या SendMessageCallback हैं न प्राप्त द्वारा निर्दिष्ट विंडो।
साथ ही, अनुप्रयोग जो अन्यथा सामान्य रूप से कार्य भी WH_CALLWNDPROC या WH_CALLWNDPROCRET विंडो हुक्स जो windows के स्वामी थ्रेड्स पर अनुप्रयोग में सेट किए जाते हैं, तो ऊपर वर्णित लक्षण अनुभव कर सकते हैं। विंडो हुक्स एक विशिष्ट थ्रेड या पर सभी UI थ्रेड्स कॉल SetWindowsHookEx फ़ंक्शन सेट किया जा सकता है।

कारण


यह व्यवहार Windows कर्नेल स्टैक कॉलिंग थ्रेड का अनुरोध की गई कार्रवाई को निष्पादित करने के लिए बढ़ाएँ करने में असमर्थ होने के कारण है। हैंडलिंग कार्यविधियाँ x64 में आवश्यक अतिरिक्त कर्नेल स्टैक के कारण Windows परिवेश, कर्नेल स्टैक पर एक तेज दर से आवर्ती बनाना विंडो प्रबंधक फ़ंक्शन को कॉल करते समय Windows वातावरण निर्यात एक x86 USER32 द्वारा उपभोग किया कर सकते हैं। DLL. यद्यपि लक्षण, इस आलेख में बताए गए हैं Windows प्लेटफॉर्म में x64 होने की अधिक संभावना, यह एक थ्रेड कर्नेल स्टैक पर x86 का उपभोग करने के लिए आवर्ती कॉल के लिए संभव है Windows प्लेटफॉर्म है।

समाधान


निम्न समाधान इस समस्या को हल करने के लिए उपयोग किया जा सकता
  1. इसके बजाए संदेश DefWindowProc के पास कर रहा है WM_WINDOWPOSCHANGED विंडो संदेश हैंडलिंग, तो चाइल्ड windows का आकार बदलें।
  2. जब चाइल्ड windows WM_WINDOWPOSCHANGED या WM_SIZE विंडो संदेश को संसाधित करते समय पुनः आकार के बजाय पैरेंट विंडो आकार बदला है, तो एसिंक्रोनस रूप से चाइल्ड windows का आकार बदलें।
  3. नेस्टेड विंडो की गहराई को कम करने के लिए अनुप्रयोग UI redesign.

अधिक जानकारी


Win32 सबसिस्टम के भाग एक करनेल-मोड डिवाइस ड्राइवर (WIN32K. में लागू किया गया हैं SYS)। कॉल फ़ंक्शन द्वारा USER32 निर्यात करने के लिए। इसके आकार और स्थिति, सहित, किसी विंडो की स्थिति परिवर्तित करने के लिए, DLL WIN32K में कॉल करेगा। अनुरोध की गई कार्रवाई को करने के लिए SYS. सामान्यतया एक विंडो की स्थिति को संशोधित फ़ंक्शन का परिणाम विंडो, जहाँ संशोधित किया जा रहा करने के लिए भेजा जा रहा संदेश विंडो में WIN32K. SYS संशोधित की जा रही विंडो का विंडो कार्यविधि को कॉल करने के लिए कोई उपयोगकर्ता-मोड कॉलआउट बनाता है। उदाहरण के लिए, WIN32K. आकार और/या विंडो की स्थिति SetWindowPos फ़ंक्शन को कॉल करने संशोधित किए गए हैं, तो SYS विंडो WM_WINDOWPOSCHANGING विंडो संदेश, और कोई WM_WINDOWPOSCHANGED विंडो संदेश भेज देंगे। DefWindowProc निर्दिष्ट विंडो के साथ WM_WINDOWPOSCHANGED संदेश कहा जाता है, जब एक WM_SIZE संदेश भेज देगा और विंडो का आकार परिवर्तित हो गया है। जब पैरेंट विंडो जिसमें WIN32K में आवर्ती कॉल्स करने के लिए लीड एक WM_WINDOWPOSCHANGED या WM_SIZE विंडो संदेश प्राप्त होता है, तो अनुप्रयोग सामान्यतया चाइल्ड windows का आकार बदलें। SYS गहराई तक नेस्टेड विंडो पदानुक्रम के लिए। अनुप्रयोग जो अन्यथा सामान्य रूप से कार्य भी WH_CALLWNDPROC या WH_CALLWNDPROCRET हुक्स प्रक्रिया में थ्रेड पर सेट हैं, तो इस आलेख में वर्णित लक्षणों का अनुभव हो सकता है। यह अतिरिक्त कर्नेल स्टैक स्थान के कारण है जब हो WIN32K. हुक कार्यविधि कॉल SYS संभालता है। कॉलिंग थ्रेड द्वारा स्वामित्व वाली विंडो के लिए विंडो संदेश भेजने के लिए SendMessage कॉल सामान्यतया WIN32K में कॉल किए बिना संदेश प्राप्त विंडो का विंडो कार्यविधि कॉल करेगा। SYS. हालांकि, SendMessage में WIN32K कॉल करेगा। यदि WH_CALLWNDPROC हुक्स SYS या WH_CALLWNDPROCRET सेट कॉलिंग थ्रेड पर WIN32K के रूप में हुक्स। SYS हुक्स और हुक कार्यविधि कॉल हैंडल प्रबंधित करता है। ऊपर नोट किया गया के रूप में, DefWindowProc निर्दिष्ट विंडो के साथ WM_WINDOWPOSCHANGED संदेश कहा जाता है, जब एक WM_SIZE संदेश भेज देगा और विंडो का आकार परिवर्तित हो गया है। एक WH_CALLWNDPROC हुक या एक WH_CALLWNDPROCRET SendMessage कॉल DefWindowProc कराता कर्नेल मोड में संक्रमण के लिए हुक कार्यविधियों को कॉल करने के लिए कारण होगा। WM_SIZE विंडो संदेशों के बजाय WM_WINDOWPOSCHANGED विंडो संदेश हैंडलिंग कर्नेल स्टैक उपयोग SendMessage के क्रम में कर्नेल मोड में संक्रमण के लिए आवश्यकता करने से कम होगी, तो चाइल्ड windows का आकार बदले हुक कार्यविधियों को कॉल करें। की इस समस्या का सामना कर रहे हैं जो Windows प्रपत्र अनुप्रयोग डेवलपर्स KB आलेख 953934में अतिरिक्त जानकारी के लिए देखें करना चाहिए।