IWebBrowser2 로 웹페이지 생성시 단축키 먹히는 방법
클라이언트 어플리케이션을 작성하다 보면 웹 페이지를 어플리케이션 내에서 호스팅 해야 할 경우가 생긴다. 이럴 경우 키보드의 단축키를 어플리케이션 내에서 먼저 잡아서 처리하므로 웹 페이지에서는 단축키가 안 먹는다. 대표적으로 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 );
}