Pencere Yöneticisi işlevleri Özyinelemeli çağrı beklenmedik şekilde başarısız olabilir

Belirtiler

Özyinelemeli çağrıları Pencere Yöneticisi işlevleri USER32 tarafından verildi. İstenen işlemin gerçekleştirilmesi ve hata kodu ayarlama olmadan DLL döndürebilir. Bu uygulamalarla iç içe pencere hiyerarşisi içinde genellikle oluşur. Belirtiler arasında karşılaşabilirsiniz:

  • Çerçeve penceresi yeniden boyutlandırıldığında alt windows doğru şekilde yeniden boyutlandırmak iç içe pencere hiyerarşisiyle uygulamalar başarısız. Windows taşınmış ve/veya MoveWindow, SetWindowPos veya DeferWindowPos arayarak yeniden boyutlandırılamaz.

  • Ana windows ya da beklendiği gibi alt pencereleri pencere iletilerini yayılmaz. DefWindowProc başarıyla iletileri üst pencere veya ileti alma penceresinin alt pencereler yaymak değil.

  • Pencere iletilerinin gönderilmesini bir pencere arama SendMessage tarafından SendMessageTimeout veya SendMessageCallback belirli bir pencere tarafından alınan değil.

Ayrıca, aksi takdirde normal olarak işlev uygulamaları uygulama windows kendi iş parçacığı üzerinde WH_CALLWNDPROC veya WH_CALLWNDPROCRET penceresi kancaları ayarlarsanız, yukarıda açıklanan belirtilerle karşılaşabilirsiniz. Penceresi kancaları tüm kullanıcı Arabirimi iş parçacıkları veya belirli bir iş parçacığı üzerinde SetWindowsHookEx işlevini çağırarak ayarlanabilir.

Neden

Bu davranış, Windows çekirdek yığınında çağıran iş parçacığının istenen işlemi gerçekleştirmek için büyüme mümkün olan bir sonucudur. Ek çekirdek yığını içinde x64 gerekli işlemleri işleme nedeniyle Windows ortamında, çekirdek yığınında yinelemeli yapma Pencere Yöneticisi işlevleri için çağırdığında Windows ortamında verilen bir x86 daha hızlı bir hızda USER32 tarafından tüketilebilir. DLL belirtiler bu makalede açıklanan, ancak Windows platformları içinde x64 gerçekleşmesi daha olası, olası bir iş parçacığının çekirdek yığın üzerinde x86 tüketmek yinelemeli çağrılar Windows platformları.

Çözüm

Bu soruna geçici bir çözüm için aşağıdaki çözümleri kullanılabilir

  1. Alt pencereler yerine DefWindowProc için ileti iletme WM_WINDOWPOSCHANGED pencere iletileri işlerken yeniden boyutlandırın.

  2. Ana pencerenin alt pencereler yerine yeniden boyutlandırma WM_WINDOWPOSCHANGED veya WM_SIZE pencere ileti işlenirken yeniden boyutlandırıldığında alt pencereler zaman uyumsuz olarak yeniden boyutlandırın.

  3. İç içe geçmiş penceresini derinliğini azaltmak için uygulama UI yeniden tasarlamanız.

Ek Bilgi

Bazı bölümleri, Win32 alt sisteminin bir çekirdek modu aygıt sürücüsü (WIN32K. uygulanır. SYS). USER32 tarafından dışarı aktarılan işlevlere olan çağrıları. Bir pencerenin boyutunu ve konumunu, dahil olmak üzere durumu değiştirmek için DLL WIN32K çağıracaktır. İstenen işlemi gerçekleştirmek için SYS. Genellikle bir pencerenin durumu değiştirme işlevleri, yeri değiştirilen penceresine gönderilen pencere iletilerinin sonuçlanan WIN32K. SYS değiştirilen penceresinin pencere yordamı çağırmak için kullanıcı modu çağrı yapar. Örneğin, WIN32K. SYS pencere boyutu ve/veya pencerenin konumunu SetWindowPos işlevini çağırarak değiştirildiğinde WM_WINDOWPOSCHANGING penceresinde ileti ve WM_WINDOWPOSCHANGED pencere ileti gönderir. DefWindowProc belirtilen pencereyi WM_WINDOWPOSCHANGED iletisiyle adlı bir WM_SIZE iletisi gönderir ve penceresinin boyutu değişti. Üst pencere WIN32K Özyinelemeli çağrıları yapmak için müşteri adayları bir WM_WINDOWPOSCHANGED veya WM_SIZE pencere ileti aldığında, uygulamalar genellikle alt pencereleri yeniden boyutlandırın. İç içe pencere hiyerarşileri için SYS. Aksi halde normal olarak işlev uygulamaları işlemdeki iş parçacıkları üzerinde WH_CALLWNDPROC veya WH_CALLWNDPROCRET kancaları ayarladığınızda, bu makalede açıklanan belirtilerle de karşılaşabilirsiniz. Bu ek çekirdek yığın alanı nedeniyle olur ne zaman tüketilen WIN32K. SYS hook yordamları çağırmak işler. Çağıran iş parçacığının sahibi bir penceresi için pencere ileti göndermek için SendMessage çağırma genellikle WIN32K çağırmanıza gerek kalmadan iletiyi alan penceresinin pencere yordamı çağırır. SYS. Ancak, SendMessage WIN32K çağıracaktır. Set arama iş parçacığı üzerinde WH_CALLWNDPROC kancaları varsa SYS veya WH_CALLWNDPROCRET WIN32K kanca oluşturur. SYS kancalar ve kanca yordamları çağıran tutamaçlar yönetir. Yukarıda belirtildiği gibi DefWindowProc bir WM_WINDOWPOSCHANGED iletisi ile çağrıldığında WM_SIZE ileti belirtilen pencereyi göndermek ve penceresinin boyutu değişti. WH_CALLWNDPROC kanca veya bir WH_CALLWNDPROCRET hook yordamları çağırmak için SendMessage çağrısı çekirdek moduna geçiş yapar DefWindowProc neden olur. WM_SIZE pencere iletilerini yerine WM_WINDOWPOSCHANGED pencere iletilerini işleme çekirdek yığını kullanımı sırada çekirdek moduna geçiş için SendMessage gereksinimini ortadan kaldırarak azaltır yeniden boyutlandırma alt pencereler hook yordamları çağırmak. Bu sorunla karşılaştıktan Windows Forms uygulaması geliştiricileri için ek bilgi için 953934KB makalesi başvurmalıdır.

Daha fazla yardıma mı ihtiyacınız var?

Yeteneklerinizi geliştirin
Eğitimleri keşfedin
Yeni özellikleri ilk olarak siz edinin
Microsoft Insider 'a katılın

Bu bilgi yardımcı oldu mu?

Geri bildiriminiz için teşekkür ederiz!

Geri bildiriminiz için teşekkürler! Office destek temsilcilerimizden biriyle görüşmeniz yararlı olabilir.

×