Przejdź do głównej zawartości
Pomoc techniczna
Zaloguj się przy użyciu konta Microsoft
Zaloguj się lub utwórz konto.
Witaj,
Wybierz inne konto.
Masz wiele kont
Wybierz konto, za pomocą którego chcesz się zalogować.

Symptomy

Wywołania cykliczne okno Menedżer funkcji eksportowanych przez USER32. Biblioteka DLL może zwrócić bez wykonywania żądanej operacji i bez ustawienia kod błędu. Zwykle występuje to w aplikacjach z hierarchią głęboko zagnieżdżonych okien. Wśród objawów mogą wystąpić:

  • Zmiany rozmiaru okien podrzędnych poprawnie, gdy zmieniany jest rozmiar okna ramki nie działać aplikacje z hierarchią głęboko zagnieżdżonych okien. Systemu Windows są przenoszone i/lub zmieniany przez wywołanie MoveWindow, SetWindowPos lub DeferWindowPos.

  • Okno wiadomości nie są propagowane do nadrzędnego systemu windows lub okien podrzędnych zgodnie z oczekiwaniami. DefWindowProc nie może pomyślnie propagować wiadomości do okna nadrzędnego lub okien podrzędnych okna komunikatu.

  • Okno wiadomości wysyłane do okna przez wywołującego SendMessage SendMessageTimeout lub SendMessageCallback nie są odbierane przez określonego okna.

Ponadto aplikacje, które w przeciwnym razie działać normalnie mogą wystąpić symptomy opisane powyżej w przypadku haków ładunkowych okno WH_CALLWNDPROC lub WH_CALLWNDPROCRET są ustawione na wątki w aplikacji, których właścicielem systemu windows. Punkty zaczepienia okna można ustawić na określonych wątków lub wszystkie wątki interfejsu użytkownika przez wywołanie funkcji SetWindowsHookEx.

Przyczyna

To zachowanie jest wynikiem systemu Windows nie będzie w stanie rozwijać stosu jądra wywołującego wątku w celu wykonania żądanej operacji. Ze względu na stosu jądra dodatkowych procedur niezbędnych w x64 obsługi środowiska Windows stosu jądra może zużytkować w szybszym tempie niż w x86 wywożonych środowiska systemu Windows, gdy dokonywanie cykliczne wywołuje okno Menedżer funkcji USER32. DLL. Mimo że symptomy opisane w tym artykule są bardziej prawdopodobne w x64 platformach systemu Windows, jest możliwe przy rekurencyjnych wywołaniach zużywają stosu jądra dla wątku na x86 platformach systemu Windows.

Rozwiązanie

Poniższe rozwiązania może służyć do obejścia tego problemu

  1. Zmienianie rozmiaru okien podrzędnych podczas obsługi komunikatów okien WM_WINDOWPOSCHANGED zamiast przekazywania wiadomości do DefWindowProc.

  2. Asynchronicznie rozmiaru okien podrzędnych, gdy zmieniany jest rozmiar okna nadrzędnego zamiast zmiany rozmiaru okien podrzędnych podczas przetwarzania komunikatu w oknie WM_SIZE lub WM_WINDOWPOSCHANGED.

  3. Ponowne zaprojektowanie aplikacji interfejsu użytkownika, aby zmniejszyć głębokość zagnieżdżonych okien.

Więcej informacji

Części podsystemu Win32 są implementowane w sterownik urządzenia trybu jądra (WIN32K. SYS). Wywołania funkcji eksportowanych przez USER32. Plik DLL, aby zmienić stan okna, włącznie z jego rozmiaru oraz położenia, będzie wzywać do WIN32K. SYS do wykonania żądanej operacji. Funkcje, które modyfikują stan okna zazwyczaj wynikiem okna wiadomości wysyłane do okna modyfikowany, gdzie WIN32K. SYS sprawia, że objaśnienie trybu użytkownika, aby wywołać procedurę okna okna modyfikowany. Na przykład, WIN32K. SYS wyśle okno komunikatu w oknie WM_WINDOWPOSCHANGING i komunikatu w oknie WM_WINDOWPOSCHANGED gdy rozmiar lub położenie okna są modyfikowane przez wywołanie funkcji SetWindowPos. DefWindowProc wyśle określonego okna WM_SIZE wiadomości, gdy wywołana z wiadomości WM_WINDOWPOSCHANGED i zmienił się rozmiar okna. Aplikacje zwykle rozmiaru okien podrzędnych, gdy okno nadrzędne odbiera komunikat okna WM_WINDOWPOSCHANGED lub WM_SIZE, co prowadzi do dokonywania wywołań cyklicznych do WIN32K. SYS dla hierarchii głęboko zagnieżdżonych okien. Aplikacje, które w przeciwnym razie działać normalnie mogą wystąpić symptomy opisane w tym artykule, gdy punkty zaczepienia WH_CALLWNDPROC lub WH_CALLWNDPROCRET są ustawione na wątki w procesie. Jest to spowodowane obszar stosu jądra dodatkowych, który jest używane, kiedy WIN32K. SYS obsługuje wywoływania procedury haka. Wywołanie SendMessage, aby wysłać wiadomość okna do okna własnością wywołującego wątku zwykle będzie wywoływać procedury okna okna odbierania wiadomości bez konieczności wywołują WIN32K. SYS. Jednakże SendMessage będzie wzywać do WIN32K. SYS, jeśli istnieją punkty zaczepienia WH_CALLWNDPROC lub WH_CALLWNDPROCRET jako WIN32K przechwytuje zestaw wątku wywołania. SYS zarządza haczyki i uchwyty wywołanie procedury haka. Jak wspomniano powyżej, DefWindowProc wyśle określonego okna WM_SIZE wiadomości, gdy wywołana z wiadomości WM_WINDOWPOSCHANGED i zmienił się rozmiar okna. Hak WH_CALLWNDPROC lub WH_CALLWNDPROCRET spowoduje wywołanie SendMessage DefWindowProc sprawia, że do przejścia do trybu jądra, w celu wywołania procedury haka. Zmiana rozmiaru okien podrzędnych podczas obsługi komunikatów okien WM_WINDOWPOSCHANGED zamiast WM_SIZE okna wiadomości zmniejsza wykorzystanie stosu jądra eliminując potrzebę SendMessage w celu przejścia do trybu jądra, w celu wywołania procedury haka. Deweloperzy aplikacji Windows Forms, które napotykają ten problem powinno odnosić się do artykułu KB 953934, aby uzyskać dodatkowe informacje.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.

Społeczności pomagają zadawać i odpowiadać na pytania, przekazywać opinie i słuchać ekspertów z bogatą wiedzą.

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?
Jeśli naciśniesz pozycję „Wyślij”, Twoja opinia zostanie użyta do ulepszania produktów i usług firmy Microsoft. Twój administrator IT będzie mógł gromadzić te dane. Oświadczenie o ochronie prywatności.

Dziękujemy za opinię!

×