Winforms / ActiveX交叉线程调用

时间:2010-07-12 18:56:22

标签: winforms activex multithreading

我有一个应用程序,其中我在自助服务终端类型的应用程序中托管多种类型的内容(图像,PowerPoint演示文稿,视频等)。用户必须能够在这些内容之间来回寻呼,最好使用自助服务终端上的触摸屏的手势,即点击屏幕的一侧前进,另一侧返回。

不幸的是,显示内容的控件可能有进一步的嵌套,所以我使用Win32鼠标钩子捕获鼠标点击,检查它们是否在指定区域内。这非常有效。不幸的是,这些点击事件是(间接)调用我用来托管PP演示文稿(DSOFramer)的ActiveX控件上的方法,并且它导致了这个令人讨厌的COM异常:

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

我最好的猜测是低级鼠标挂钩是从另一个线程调用的,因为如果我直接从Winforms UI线程进行调用,则没有问题。我尝试了标准的Winforms Invoke / BeginInvoke但没有成功。

1 个答案:

答案 0 :(得分:1)

我使用的是典型的Winforms跨线程模式:

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

当然我正在调用的控件不知道AX控件,所以我需要显式调用该操作。它还需要使用BeginInvoke,因此上面变为:

BeginInvoke(new Action(DoStuff));

立即行动。糟糕!