2009-05-15 8 views
0

Ich habe ein kleines Problem mit meiner Anwendung mit MSHTML. Ich habe alles außer dem seltsamen Tastenanschlag fehlendes Verhalten beim Tippen schnell wie in der Betreffzeile erwähnt. Ich denke, dass es vielleicht mit der Methode zu tun hat, mit der ich die Ereignisse versenke? Die Details: Meine Anwendung ist ein separates Programm in C++ und MFC in Visual Studio 2005 geschrieben. Das Programm wird an eine derzeit ausgeführte (unabhängige) Instanz von Internet Explorer angefügt und ruft den Zeiger auf IWebBrowser2 Schnittstelle und übergibt es an ein Objekt vom Typ CCmdTarget:MSHTML IWebBrowser2 - Sinkende Seitenereignisse verursachen verpasste Tastenanschläge?


class CHandler : public CCmdTarget 
{ 
    IWebBrowser2* m_pWebBrowser2; 
    DWORD m_dwBrowserCookie; 
    … 
    DECLARE_DISPATCH_MAP() 
}; 

Diese Klasse verfolgt, was im Browser geschieht. Ich sinke die Browser-Ereignisse mit dem folgenden Befehl:


LPUNKNOWN pUnkSink = GetIDispatch(FALSE); 
retval = AfxConnectionAdvise((LPUNKNOWN)m_pWebBrowser2, DIID_DWebBrowserEvents2, pUnkSink, FALSE, &m_dwBrowserCookie); 

Wenn ich die AfxConnectionAdvise kommentieren, dann werden keine Tastatureingaben verpasst, aber nicht mehr Ereignisse. Wenn ich es verlasse, versenke ich die Ereignisse, vermisse aber den gelegentlichen Tastendruck, wenn ich schnell tippe.

Ich weiß, es gibt eine Reihe von Möglichkeiten der Verbindung zu den Ereignissen (AtlAdvise, Verbindungspunkte), aber das war das einzige, das ich arbeiten konnte.

Alle Vorschläge wären großartig!

Antwort

0

Wenn Sie nur nach Tastenanschlägen suchen, können Sie das Steuerelement nicht unterklassifizieren?

+0

Ich glaube nicht, dass das OP Tastenanschläge will; Ich denke, sie wollen Webbrowser-Ereignisse und möchten nur Tastenanschläge funktionieren, ohne Zeichen zu verlieren. –

+0

Das stimmt, ich bin nicht wirklich an den Tastenanschlägen interessiert. Aber wenn man schnell tippt, werden einige fallengelassen, was als Benutzer nervt. Ich bin mir ziemlich sicher, dass es wegen der Art und Weise ist, wie ich die Ereignisse versenke, weil es das Problem nicht behebt. – Brian

0

Unter den Abdeckungen alle verschiedenen Verbindungsmethoden (AtlAdvise, AfxConnectionAdvise, etc.) verwenden alle IConnectionPointContainer und IConnectionPoint - sie sind nur sparen Sie vorformulierten COM Schmiere eingeben.

Ich vermute, dies hat damit zu tun, wie Sie mit der laufenden Instanz von IE verbinden. Wie bekommen Sie den Zeiger IWebBrowser2? Werden Sie in den IE-Prozess geladen oder sind Sie ein separater Prozess? Wenn Sie auf einem anderen Thread als dem ursprünglichen Thread (dem IE Tab UI-Thread) IWebBrowser2 ausgeführt werden, führen Sie ordnungsgemäßes COM-Marshalling durch?

+0

Ich laufe in einem separaten Thread. Ich verwende SHDocVw :: IShellWindowsPtr, um auf die laufende Instanz von IE zuzugreifen. Um den Browserzeiger zu erhalten, lade ich ihn unter Verwendung von: _variant_t va (index_to_window, VT_I4); spDisp = m_spSHWinds-> Element (va); SHDocVw :: IWebBrowser2Ptr spBrowser (spDisp); spBrowser-> AddRef(); Und speichern Sie spBrowser für die spätere Verarbeitung, die m_pWebBrowser2 im obigen Beispiel. Ich spin einen Thread aus, um mit der Verarbeitung an einem bestimmten Punkt zu helfen und Marshalling dort zu verwenden, aber nicht im Hauptprogrammthread. Es scheint seltsam, dass es gut funktionieren würde, solange ich keine Ereignisse festhalte. Ich werde das allerdings untersuchen. Danke. – Brian

Verwandte Themen