클라이언트 어플리케이션을 작성하다 보면 웹 페이지를 어플리케이션 내에서 호스팅 해야 할 경우가 생긴다. 이럴 경우 키보드의 단축키를 어플리케이션 내에서 먼저 잡아서 처리하므로 웹 페이지에서는 단축키가 안 먹는다. 대표적으로 Tab, Delete, Return, Ctrl+A, Ctrl+C, Ctrl+X, Ctrl+V 등이 있다.
웹 페이지만 따로 띄워서 보면 위의 키들이 다 잘 작동하나 어플리케이션 내에서 웹 페이지를 호스팅 하는 경우는 많이 사용하는 키임에도 불구하고 작동을 하지 않는다. 이럴 경우에는 어플리케이션의 PreTranslateMessage에서 웹 페이지로 단축키를 넘겨주면 된다.

virtual BOOL PreTranslateMessage(MSG* pMsg)
 {
  if( pMsg->message == WM_KEYDOWN )
  {
   TRACEMSG(1, _T("KeyDown: 0x%x"), pMsg->wParam) ;
   if ( pMsg->wParam == VK_DELETE || pMsg->wParam == VK_TAB || pMsg->wParam == VK_RETURN)
   {
    return SendAcceleratorToWeb(pMsg) ;
   }

   if( pMsg->wParam == 'A' || pMsg->wParam == 'C' || pMsg->wParam == 'X' || pMsg->wParam == 'V' )
   {
    // Ctrl 키가 눌러져 있다면... 다른 키의 조합은 & 으로 하면 된다.
    // GetKeyState( VK_CONTROL & VK_SHIFT )

    if( GetKeyState( VK_CONTROL ) < 0 )
     return SendAcceleratorToWeb(pMsg);
   }
  }

  return CWindow::IsDialogMessage(pMsg) ;
 }

 BOOL SendAcceleratorToWeb( MSG* pMsg )
 {
  CComQIPtr<IOleInPlaceActiveObject, &IID_IOleInPlaceActiveObject> pIOIPAO(m_spWebBrowser) ;

  HRESULT hr = S_FALSE ;

  if( pIOIPAO )
  {
   hr = pIOIPAO->TranslateAccelerator(pMsg) ;
  }

  return ( hr == S_OK ?  TRUE : FALSE );
 }


Posted by 모과이IT
,