DetailPage-MSS-KB

기술 자료

기술 자료: 187988 - 마지막 검토: 2006년 11월 21일 화요일 - 수정: 6.1

 

이 페이지에서

현상

모덜리스 대화 상자의 부모 창 또는 propertysheet 창에서 ActiveX 컨트롤이 있을 때 Tab 키, 화살표 키 및 액셀러레이터 키 예상대로 작동하지 않습니다. Tab 키가 입력된 포커스가 한 컨트롤에서 이동하는지 않습니다. 모덜리스 대화 상자 또는 propertysheet 액셀러레이터 키 또는 화살표 키를 눌러 창의 아무 효과가 없습니다.

원인

ActiveX 컨트롤을 메시지 펌프를 소유하지 않는 문제가 있습니다. 컨테이너 응용 프로그램에서 메시지 펌프가 소유됩니다. 따라서 모든 키 입력 메시지는 컨테이너 응용 프로그램에서 가져온 및 모덜리스 대화 상자 또는 propertysheet 창 발송되었습니다.

메시지 펌프 대화 상자 관리자가 소유하고 이를 걸리는 모든 키 입력 메시지를 처리하는 중 주의를 때문에 문제가 있는 모달 대화 상자를/propertysheet 창을 발생하지 않습니다.

해결 방법

모덜리스 대화 상자/propertysheet 파생된 클래스의 키 입력을 차단하고 액셀러레이터 키를 처리할 수 있도록 Windows WH_GETMESSAGE 후크를 설치하십시오.

현재 상태

이것은 의도적으로 설계된 동작입니다.

추가 정보

다음 샘플에서는 Windows 설치 방법을 보여 줍니다. 모덜리스 CPropertySheet 파생된 클래스에 메시지 후크:

예제 코드

   // Handle to the Windows Message hook. It can be a global variable or a
   // member variable in your CPropertySheet-derived class.
   HHOOK hHook = NULL;



   // Hook procedure for WH_GETMESSAGE hook type.
   LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
   {
      // Switch the module state for the correct handle to be used.
      AFX_MANAGE_STATE(AfxGetStaticModuleState( ));



      // If this is a keystrokes message, translate it in controls'
      // PreTranslateMessage().
      LPMSG lpMsg = (LPMSG) lParam;
      if( (nCode >= 0) &&
         PM_REMOVE == wParam &&
         (lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) &&
         AfxGetApp()->PreTranslateMessage((LPMSG)lParam) )
         {
         // The value returned from this hookproc is ignored, and it cannot
         // be used to tell Windows the message has been handled. To avoid
         // further processing, convert the message to WM_NULL before
         // returning.
         lpMsg->message = WM_NULL;
         lpMsg->lParam = 0L;
         lpMsg->wParam = 0;
         }



      // Passes the hook information to the next hook procedure in
      // the current hook chain.
      return ::CallNextHookEx(hHook, nCode, wParam, lParam);
   }



   // Declare and define the following two functions:
   BOOL CModelessPropertySheet::OnInitDialog()
   {
      CPropertySheet::OnInitDialog();

      // Install the WH_GETMESSAGE hook function.
      hHook = ::SetWindowsHookEx(
         WH_GETMESSAGE,
         GetMessageProc,
         AfxGetInstanceHandle(),
         GetCurrentThreadId());
      ASSERT (hHook);



      return TRUE;   // Return TRUE unless you set the focus to a control.
                     // EXCEPTION: OCX Property Pages should return FALSE.


   }



   void CModelessPropertySheet::OnClose()
   {
      // Uninstall the WH_GETMESSAGE hook function.
      VERIFY (::UnhookWindowsHookEx (hHook));



      CPropertySheet::OnClose();

   }
				

문제를 재현하는 방법

  1. MFC ActiveX ControlWizard ActiveX 만들려면 선택한 제어. 모든 기본 설정을 사용하십시오.
  2. 컨트롤 안을 두 번 때 모덜리스 대화 상자 또는 propertysheet 창을 표시하십시오.
결과: Tab 키 또는 액셀러레이터 키를 누르면 모덜리스 대화 상자 또는 propertysheet 창에 표시된 경우 아무 효과가 없습니다.

참조

(c) Microsoft의 1998, 예약 모든 권한. Yeong Kah Tam, Microsoft Corporation에 의해 기고물.


본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Foundation Class Library 4.2 을(를) 다음과 함께 사용했을 때
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
키워드: 
kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtko
기계 번역된 문서기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
공유
추가 지원 옵션
Microsoft Community 지원 포럼
직접 문의하기
Microsoft Certified Partner 찾기
Microsoft Store