2010-07-12 2 views
1

J'ai une application dans laquelle j'accueille plusieurs types de contenu (images, présentations PowerPoint, vidéos, etc.) dans une application de type kiosque. L'utilisateur doit être capable de faire des allers-retours entre ces morceaux de contenu, de préférence en utilisant des gestes de l'écran tactile sur le kiosque, c'est-à-dire appuyer sur un côté de l'écran pour avancer, l'autre côté pour revenir en arrière.Appels croisés Winforms/ActiveX

Malheureusement, les contrôles qui affichent le contenu pourraient avoir d'autres imbrications. J'utilise donc un hook souris Win32 pour capturer les clics de souris, en vérifiant s'ils se trouvent dans une région spécifiée. Cela fonctionne très bien. Malheureusement, ces événements de clic sont (indirectement) appelant des méthodes sur le contrôle ActiveX que je utilise pour accueillir des présentations PP (DSOFramer), et il est à l'origine de cette mauvaise exception COM:

An outgoing call cannot be made since the application is dispatching an input-synchronous call. (Exception from HRESULT: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL))

Ma meilleure estimation est que le faible Le hook de souris de niveau appelle à partir d'un thread différent, car si je fais l'appel directement à partir du thread d'interface utilisateur Winforms, il n'y a pas de problème. J'ai essayé le Winforms Invoke/BeginInvoke standard sans succès.

Répondre

1

j'utilisais le Winforms typique motif en croix-fil:

if(InvokeRequired) 
{ 
    Invoke(new Action(DoStuff)); 
} 
else 
{ 
    DoStuff(); 
} 

Bien sûr, le contrôle que je vous appelle de n'a aucune idée du contrôle AX, donc j'ai besoin d'invoquer explicitement l'action. Il a également besoin d'utiliser BeginInvoke, de sorte que le ci-dessus devient:

BeginInvoke(new Action(DoStuff));

fonctionne maintenant. Oops!

Questions connexes