2009-05-15 8 views
0

J'ai un petit problème avec mon application utilisant MSHTML. J'ai tout fonctionné excepté le comportement manquant de frappe impaire en tapant rapidement comme mentionné dans la ligne d'objet. Je pense que cela peut avoir à faire avec la méthode que j'utilise pour couler les événements?MSHTML IWebBrowser2 - L'enchaînement des événements de page provoque des frappes manqués?

Les détails: mon application est un programme distinct écrit en C++ et MFC dans Visual Studio 2005. Le programme attache à une instance (indépendante) en cours d'exécution d'Internet Explorer et obtient le pointeur à l'interface IWebBrowser2 et le transmet à un objet de type CCmdTarget:


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

Cette classe conserve la trace de ce qui se passe dans le navigateur. Je les événements de sombrer navigateur avec la commande suivante:


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

Si je commente le AfxConnectionAdvise, aucune des séquences de touches ne sont pas saisies, mais pas d'autres événements. Si je le laisse dedans je couler les événements mais manquer la frappe occasionnelle si je tape rapidement.

Je sais qu'il existe un certain nombre de façons de se connecter aux événements (AtlAdvise, points de connexion), mais c'était le seul que je pouvais travailler.

Toutes les suggestions seraient super!

Répondre

0

Si vous recherchez simplement des séquences de touches, ne pouvez-vous pas sous-classer le contrôle?

+0

Je ne pense pas que l'OP veut des frappes; Je pense qu'ils veulent des événements de webbrowser et veulent juste que les frappes au clavier fonctionnent sans laisser tomber des caractères. –

+0

C'est vrai, je ne suis pas vraiment intéressé par les frappes. Mais lorsque vous tapez rapidement, certains sont abandonnés, ce qui est ennuyeux en tant qu'utilisateur. Je suis à peu près certain que c'est à cause de la façon dont je coule les événements, parce que ne pas les faire disparaître résout le problème. – Brian

0

sous les couvertures toutes les différentes méthodes de connexion (AtlAdvise, AfxConnectionAdvise, etc) utilisent tous IConnectionPointContainer et IConnectionPoint - ils sont juste vous sauver tapant boilerplate COM goo.

Je suppose que cela a à voir avec la façon dont vous vous connectez à l'instance en cours d'IE. Comment obtenez-vous le pointeur IWebBrowser2? Êtes-vous chargé dans le processus d'EI ou êtes-vous un processus distinct? Si vous utilisez un thread différent du thread d'origine de IWebBrowser2 (le thread de l'interface utilisateur de l'onglet IE), faites-vous une bonne gestion de session COM?

+0

Je cours dans un fil séparé. J'utilise SHDocVw :: IShellWindowsPtr pour accéder à l'instance en cours d'IE. Pour obtenir le pointeur du navigateur, je le charge en utilisant: _variant_t va (index_to_window, VT_I4); spDisp = m_spSHWinds-> Item (va); SHDocVw :: IWebBrowser2Ptr spBrowser (spDisp); spBrowser-> AddRef(); Et enregistrer spBrowser pour un traitement ultérieur, le m_pWebBrowser2 dans l'exemple ci-dessus. Je désactive un thread pour faciliter le traitement à un moment donné et j'utilise le marshalling ici, mais pas dans le thread principal du programme. Il semble bizarre que cela fonctionne bien tant que je ne piège pas les événements? Je vais regarder dans cela cependant. Merci. – Brian

Questions connexes