назначение события onmouseover моему htmldocument не работает - PullRequest
2 голосов
/ 28 августа 2011

Я работаю над проектом, в котором пишу приложение ac # для windows , которое хочет получить текущий элемент под курсором из запущенного экземпляра Internet Explorer.

Я могу получить дескриптор IHtmlDocument2 работающего экземпляра IE, и я хочу назначить ему событие onmouseover следующим образом:

 DHTMLEventHandler myHandler = new DHTMLEventHandler(htmlDocument);
 myHandler.Handler += new DHTMLEvent(this.BrowserEventHandler);
 htmlDocument.onmouseover = myHandler;

И потому что я не хотел, чтобы IE ел другие события (известныйно решенный вопрос) я должен создать класс DHTMLEventHandler следующим образом:

public delegate void DHTMLEvent(IHTMLEventObj obj);

[ComVisible(true)]
public class DHTMLEventHandler
{
    public DHTMLEvent Handler;

    private IHTMLDocument2 Document;

    public DHTMLEventHandler(IHTMLDocument2 doc)
    {
        Document = doc;
    }

    [DispId(0)]
    public void Call()
    {
        Handler(Document.parentWindow.@event);
    }
}

И мой метод BrowserEventHandler выглядит так:

public void BrowserEventHandler(IHTMLEventObj e)
    {
    }

Все еще пуст (но я хочу получить элементinnerHtml под курсором), но этот метод все еще пуст, и я получаю:

Первое случайное исключение типа 'System.InvalidCastException' произошло в FindText.exe

Всякий раз, когда я перемещаю мышь.

Вопросы:

  1. Почему я получаю это исключение?
  2. Возможно ли получить электронное письмо?.srcElement.innerhtml в переменной и использовать в мy c # application?

Дайте мне знать, если что-то неясно и неоднозначно.Заранее спасибо за любую помощь и идеи.Я очень благодарен за любые комментарии и помощь.

Обновление:

Чтобы ответить на мой второй вопрос, кажется возможным получить e.srcElement.innerHTML изIHTMLEventObj e, но я действительно не знаю, почему метод BrowserEventHandler никогда не вызывается.Любые идеи или советы?

update2:

Хорошо, я нашел проблему.Сначала я изменил некоторые настройки своего проекта, чтобы получить строку, в которой сначала возникает исключение (поскольку это исключение с первого шанса), например:

В visual studio: Меню >> Отладка >> Исключения >> Исключения CLR>> system и проверьте опцию throw для SystemInvalidCastException.

Я обнаружил, что проблема в этой строке DHTMLEventHandler class:

Handler(Document.parentWindow.@event); 

Он выбрасывает Invalid Cast Exception, который, я думаю, связан сThread s согласно моим недавним поискам.

Полагаю, мне следует установить ApartmentState на ApartmentState.STA.Но я не знаю как.есть идеи?

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Хорошо, я нашел решение!:)

Мне нужно было изменить класс DHTMLEventHandler следующим образом:

public delegate void DHTMLEvent(IHTMLEventObj obj);

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class DHTMLEventHandler
{
    private Thread currentThread;
    public DHTMLEvent Handler;

    private IHTMLDocument2 Document;

    public DHTMLEventHandler(IHTMLDocument2 doc)
    {
        Document = doc;
    }

    [DispId(0)]
     [STAThread]
    public void Call()
    {
        currentThread = Thread.CurrentThread;
       Thread parentWin = new Thread(new ThreadStart(pWindowHandler));
        parentWin.SetApartmentState(ApartmentState.STA);
        parentWin.Start();
        currentThread.Suspend();
       // Handler(Document.parentWindow.@event);

    }
    public void pWindowHandler()
    {
        Handler(Document.parentWindow.@event);
        currentThread.Resume();
    }
}

Но если кто-то еще попытается использовать мое решение, я не знаю, есть ли у него какие-либо побочные эффекты вдругие ситуации.По крайней мере, это прекрасно работает для меня!:)

0 голосов
/ 29 августа 2011

Для настройки квартиры используйте http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx

...