2012-04-02 3 views
0

IE 용 C# BHO 플러그인에서 작업 중입니다. 스크롤 이벤트에 반응하는 플러그인. 그것을 책임지는 코드 울부 짖음 :IE9 용 C# BHO에서 Onscroll 이벤트 처리

var document = (HTMLDocument)webBrowser.Document; 
((HTMLWindowEvents2_Event)document.parentWindow).onscroll += WebBrowserWindowOnScroll; 

이 접근법은 IE7과 IE8에서 잘 작동합니다. 하지만 IE9에서는 전혀 쓸모가 없습니다. 이 해결 방법을 발견했습니다 : http://social.msdn.microsoft.com/Forums/et-EE/ieextensiondevelopment/thread/808df95a-c559-44c3-93b7-b9e3b2c3b737

문제는 해결해야하지만 불행히도 C++에서는 해결해야하며 C#으로 이동하지 못했습니다. 누군가가 IE9의 해결 방법을 제안 할 수 있습니까? 아니면 C#에서 위에서 언급 한 방법을 구현할 수 있습니까?

감사합니다.

답변

0

나는 해결책을 발견 할 수 있었다.

IHTMLWindow3은 이벤트 처리에 대한 책임을 져야하는 첫 번째 인수 (내 경우에는 "onscroll") 및 객체와 이벤트의 이름을 필요로하는 방법 는 attachEvent 있습니다. 가장 까다로운 부분은이 핸들러 객체와 연결됩니다. IDispatch 인터페이스를 구현해야하지만 IE9는이 인터페이스를 매우 기괴한 방식으로 사용합니다. 호출해야하는 메서드 이름을 지정하지 않고 IDispatch.Invoke을 호출합니다. .NET 자동 때의 IDispatch 의해 표시된 클래스 [ClassInterface (ClassInterfaceType.AutoDispatch)] 특성을 구현하고 의 인수 IDispatch.Invoke에 따른 인스턴스의 메소드를 호출하는 반사를 사용한다. 이 경우 메서드 이름은 비어 있으므로 아무 것도 호출되지 않습니다. [DispId (0)] 속성을 사용하면이 문제를 해결할 수 있으며 Invoke가 빈 메서드 이름을 받으면 호출 할 메서드를 지정합니다.

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDispatch)] 
public class EventListener 
{ 
    [DispId(0)] 
    public void HandleEvent(object target) 
    { 

    } 
} 

핸들러 메소드의 이름은 중요하지 않습니다. 그러나 그 서명은 중요합니다. f.e. 'onscroll'이벤트의 경우 위에 표시된 것과 같아야합니다. 'onclick'핸들러는 인수 등이 필요하지 않습니다.