창 관리자 기능에 대 한 재귀 호출을 예기치 않게 실패할 수 있습니다.

증상

재귀는 USER32에서 내보낸 창 관리자 함수를 호출 합니다. DLL 오류 코드를 설정 하지 않고 하 고 요청된 된 작업을 수행 하지 않고 반환 될 수 있습니다. 창 안쪽에 중첩 된 계층 구조를 사용 하 여 응용 프로그램에서 일반적으로 발생 합니다. 증상 중에서 발생할 수 있습니다.

  • 창 안쪽에 중첩 된 계층 구조를 사용 하 여 응용 프로그램 프레임 창의 크기를 조정할 때 자식 창이 제대로 조정 되지 않습니다. Windows는 이동 및/또는 MoveWindow, SetWindowPos 또는 DeferWindowPos를 호출 하 여 크기를 조정 합니다.

  • 메시지 창에 부모 창 또는 자식 창을 예상 대로 전파 되지 않습니다. DefWindowProc 전파할 수 없습니다 성공적으로 메시지를 부모 창 또는 메시지 창의 자식 창입니다.

  • 지정한 창에서 SendMessageTimeout 또는 SendMessageCallback를 도달 하지 않은 호출 SendMessage로 창에 창 메시지 보냅니다.

또한, 그렇지 않으면 정상적으로 작동 하는 응용 프로그램 창 후크가 WH_CALLWNDPROC 또는 WH_CALLWNDPROCRET는 창을 소유 하는 스레드 응용 프로그램에 설정 된 경우 위에서 설명한 문제가 발생할 수도. 창 후크가 SetWindowsHookEx 함수를 호출 하 여 모든 UI 스레드 또는 특정 스레드에 설정할 수 있습니다.

원인

이 동작은 Windows 커널 스택 호출 스레드가 요청된 된 작업을 수행 하기 위해 확장 처리할 수 없는 것입니다. 처리 절차는 x64에서 필요한 추가 커널 스택 인해 Windows 환경으로는 x86 재귀 만들기 창 관리자 기능을 호출할 때 Windows 환경에서 내보낼 때 보다 빠른 속도로 USER32 커널 스택을 사용할 수 있습니다. Dll이 문서에서 설명 하는 증상은 Windows 플랫폼에서 x64 발생할 가능성이 높습니다, 재귀 호출 x86에서 스레드의 커널 스택을 사용 하는 Windows 플랫폼.

해결 방법

이 문제를 해결 하려면 다음과 같은 솔루션을 사용할 수 있습니다.

  1. DefWindowProc를 메시지를 전달 하는 대신 WM_WINDOWPOSCHANGED 창 메시지를 처리 하는 경우 자식 창 크기를 조정.

  2. 비동기적으로 WM_WINDOWPOSCHANGED 또는 창 WM_SIZE 메시지를 처리 하는 동안 자식 창 크기를 조정 하는 대신 부모 창의 크기가 조정 될 때 자식 창 크기 조정.

  3. 중첩 된 창 깊이 줄이기 위해 응용 프로그램 UI를 다시 디자인 하십시오.

추가 정보

Win32 하위 시스템의 일부 (WIN32K 커널 모드 장치 드라이버에서 구현 되는. SYS)입니다. USER32에서 내보낸 함수를 호출 합니다. WIN32K 창 크기 및 위치, 상태를 변경 하는 DLL 호출 합니다. SYS 요청한 작업을 수행할 수 있습니다. 일반적으로 창의 상태를 수정 하는 기능 창 메시지를 수정 하 고 창으로 전송 되 고 결과가 WIN32K. SYS는 사용자 모드 설명선을 수정 창의 창 프로시저를 호출할 수 있습니다. WIN32K입니다. SYS는 SetWindowPos 함수를 호출 하 여 크기 및/또는 창의 위치가 수정 될 때 WM_WINDOWPOSCHANGING 창 메시지와 WM_WINDOWPOSCHANGED 창 메시지 창이 보냅니다. DefWindowProc 지정한 창 WM_SIZE 메시지 WM_WINDOWPOSCHANGED 메시지를 사용 하 여 호출을 나타납니다 창의 크기가 변경 되었습니다. 응용 프로그램 일반적으로 부모 창의 WIN32K으로 재귀 호출 하는 WM_WINDOWPOSCHANGED 또는 WM_SIZE 창 메시지를 받을 때 자식 창 크기를 조정. 많이 중첩 된 창 계층 구조에 대 한 시스템입니다. 그렇지 않은 경우 정상적으로 작동 하는 응용 프로그램 프로세스의 스레드를 설정 하는 WH_CALLWNDPROCRET 또는 WH_CALLWNDPROC 후크가이 문서에서 설명 하는 현상이 발생할 수도. 이 추가 커널 스택 공간을 사용 하는 경우 WIN32K. SYS 후크 프로시저 호출을 처리 합니다. 호출 스레드가 소유한 창에 창 메시지를 보낼 SendMessage를 호출 일반적으로 WIN32K를 호출 하지 않고 메시지를 받는 창 창 프로시저를 호출 됩니다. SYS입니다. 그러나 WIN32K SendMessage 호출 합니다. SYS 경우 WH_CALLWNDPROC 후크 또는 WH_CALLWNDPROCRET 집합 호출 스레드에서 WIN32K으로 후크. SYS 후크와 후크 프로시저 호출 핸들을 관리 합니다. 위에서 언급 했 듯이 DefWindowProc 지정한 창 WM_SIZE 메시지 WM_WINDOWPOSCHANGED 메시지를 사용 하 여 호출을 나타납니다 창의 크기가 변경 되었습니다. WH_CALLWNDPROC 후크 또는 WH_CALLWNDPROCRET를 하면 SendMessage 호출 DefWindowProc은 커널 모드로 전환에 후크 프로시저를 호출 하기 위해. 크기 조정 자식 창을 WM_SIZE 창 메시지 대신 WM_WINDOWPOSCHANGED 창 메시지를 처리 SendMessage 순서로 커널 모드로 전환 하는 필요성을 제거 하 여 커널 스택 사용이 감소 하는 경우 후크 프로시저를 호출 합니다. 이 문제를 발생 하는 Windows Forms 응용 프로그램의 개발자가 자세한 내용은 KB 문서 953934을 참조 해야 합니다.

추가 도움이 필요하신가요?

기술 향상
교육 살펴보기
새로운 기능 우선 가져오기
Microsoft Insider 참가

이 정보가 유용한가요?

소중한 의견에 감사드립니다.

피드백을 주셔서 감사합니다. Office 지원 에이전트와 연락하는 것이 도움이 될 것 같습니다.

×