5

addEventListener에 대한 MSDN 설명서에 IDispatch * 개체의 형태로 콜백 함수를 허용한다고 나와 있습니다. C# (COM interop 사용)에서 Visual Studio는 매개 변수 유형을 object으로 표시합니다.IE9에서 MSHTML의 addEventListener를 사용하여 이벤트 리스너를 추가하려면 어떻게해야합니까?

IEventListener 인터페이스 나 비슷한 것을 찾았지만 찾지 못했습니다. 나는 무엇을 통과해야합니까?

답변

5

약간의 연구 끝에이 COM 연결 지점 (이벤트 처리기)이 DispId(0)으로 지정되었음을 알았습니다. 콜백 기능은 클래스의 인스턴스로 표현됩니다 좋아 : DispId(0) 이후

// These attributes may be optional, depending on the project configuration. 
[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDispatch)] 
public class EventListener 
{ 
    [DispId(0)] 
    // The "target" parameter is an implementation detail. 
    public void NameDoesNotMatter(object target, IDOMEvent evt) { ... } 
} 

는 호출하는 기본 방법을 지정하는 방법의 실제 이름은 중요하지 않습니다. 그러나 메소드 매개 변수는 확실히 중요합니다. 예를 들어 IHTMLElement.onclick에는 인수가없는 콜백이 할당되어야하고 IHTMLElement2.attachEventIHTMLEventObj (IHTMLEventObj2, ..., 6 또는 심지어 object) 유형의 매개 변수를 사용하여 콜백을받습니다.

요약하면 COM IDispatch 콜백은 올바른 인수를 허용하고 [DispId(0)]이라는 주석이 달린 메서드로 COM 표시 클래스를 사용하여 C#에서 구현할 수 있습니다. IE9 DOM 객체는 브라우저 호환성을 위해 낮은 문서 모드를 사용하고이 메소드를 지원하지 않는 한이 모든에도 불구하고


는 W3C DOM 이벤트 API를 방지 솔루션이 더 적합 할 수있다. 예를 들어, addEventListener을 사용하는 확장 프로그램은 IE7 모드로 렌더링되는 Bing과 같은 페이지에서 실패합니다.

IWebBrowser2 인스턴스가 사용하는 문서 모드를 수동으로 F12 개발자 도구를 사용하지 않고 설정할 수도없는 것처럼 보입니다.

관련 문제