2017-01-30 9 views
0

C++ 응용 프로그램에 Internet Explorer 11이 포함되어 있습니다. 나는 다음과 같은 인터페이스를 구현 한 :IEle에 대한 IOleClientSite 구현은 WM_KEYUP 및 WM_KEYDOWN 이벤트를 잃습니다.

IDocHostUIHandler

이 외부 물체의 내 구현을 반환 GetExternal을 제외하고 원래의 구현에 모든 방법을 전달합니다.

IOleClientSite

이렇게하면 모든 방법이 원래 구현으로 전달됩니다. QueryInterface 구현은 요청시 IDocHostUIHandler를 반환합니다. 또한 IUnknown에 대해 자체를 반환합니다. 원래 IOleClientSite 구현을 통해 다른 인터페이스에 대한 요청을 전달하려고 시도했지만 아래에 설명 된 문제에는 영향을 미치지 않습니다.

DOM 이벤트를 처리하고 실행하기 위해 이벤트 싱크를 현재 문서에 첨부했지만 문제의 일부가 아닌 것으로 확신합니다.

문제는 브라우저가 WM_KEYDOWN 및 WM_KEYCHAR 메시지를 무시한다 (이러한 DOM 이벤트로 발사되지 않습니다)하지만 메시지를 WM_CHAR에 응답 않는다는 것입니다 (DOM 키 누르기 이벤트로 발사되는.) 내 된 IOleClientSite 구현을 삽입하지 않는 경우 이러한 이벤트는 올바르게 처리됩니다. 따라서 IOleClientSite를 구현할 때 약간의 누락이 있음을 확신합니다. 구현 IDocHostUIHandler를 제공하려면 IOleClientSite를 구현해야한다는 것을 이해합니다. 즉, 해당 인터페이스의 구현을 삽입하는 다른 방법은 없습니다. 왜 내 WM_KEYDOWN 및 WM_KEYCHAR 메시지가 무시됩니까?

다른 모든 기능이 올바르게 작동하고 있습니다. 자바 스크립트에서 외부 객체의 메서드를 호출 할 수 있습니다. 이벤트 싱크에서 DOM 이벤트를받을 수 있으며 DOM에 이벤트를 실행할 수 있습니다.

가치가있는 사이트는 QT 3.3 QAxWidget에 의해 제공됩니다. 나는 이것이 시대에 뒤 떨어진 것이라는 것을 알고있다; 이 작업은 궁극적으로이 오래된 코드에 대한 종속성을 제거하기위한 것입니다. 그럼에도 불구하고 IOleClientSite가 제거 될 때 브라우저가 제대로 작동하므로 QAxWidget 구현에서 문제가 의심 될 이유가 없습니다.

+0

포함 된 IE11 컨트롤에서 [WM \ _KEYUP 및 WM \ _KEYDOWN 메시지가 손실 될 수 있습니다] (http://stackoverflow.com/questions/40977258/wm-keyup-and-wm-keydown-messages-lost-in- 임베디드 -11 제어) – acelent

답변

0

이것은 두 가지 문제가 조합 된 것으로 밝혀졌습니다. 브라우저를 포함하는 QAxWidget은 파생 클래스에서 TranslateKeyEvent를 구현해야합니다. 또한 Qt3.3이 깨 졌으므로 IOleClientSite 구현을 제공 할 수 없으며 내부적으로 새로운 구현 대신 자신의 구현을 계속 참조합니다. setDocHostUIHandler 함수를 추가하기 위해 QAxWidget을 수정하고이를 반환하도록 QueryInterface를 수정해야했습니다. 따라서 기본 IOleClientSite는 IID_IDocHostUIHandler에 대한 올바른 인터페이스를 반환합니다.