Winforms/ActiveX跨线程调用

Winforms/ActiveX跨线程调用,winforms,activex,multithreading,Winforms,Activex,Multithreading,我有一个应用程序,其中我在一个kiosk类型的应用程序中托管多种类型的内容(图像、PowerPoint演示、视频等)。用户必须能够在这些内容位之间来回翻页,最好使用信息亭上触摸屏的手势,即点击屏幕的一侧前进,另一侧后退 不幸的是,显示内容的控件可能有进一步的嵌套,因此我使用Win32鼠标挂钩捕获鼠标单击,检查它们是否在指定区域内。这很有效。不幸的是,这些单击事件(间接地)调用了我用来主持PP演示文稿(DSOFramer)的ActiveX控件上的方法,并导致了这种严重的COM异常: 无法进行传出呼

我有一个应用程序,其中我在一个kiosk类型的应用程序中托管多种类型的内容(图像、PowerPoint演示、视频等)。用户必须能够在这些内容位之间来回翻页,最好使用信息亭上触摸屏的手势,即点击屏幕的一侧前进,另一侧后退

不幸的是,显示内容的控件可能有进一步的嵌套,因此我使用Win32鼠标挂钩捕获鼠标单击,检查它们是否在指定区域内。这很有效。不幸的是,这些单击事件(间接地)调用了我用来主持PP演示文稿(DSOFramer)的ActiveX控件上的方法,并导致了这种严重的COM异常:

无法进行传出呼叫,因为应用程序正在调度输入同步呼叫。(来自HRESULT的异常:0x8001010D(RPC_E_CANTCALLOUT_ININPUTSYNCCALL))


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

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

if(InvokeRequired)
{
    Invoke(new Action(DoStuff));
}
else
{
    DoStuff();
}
当然,我从中调用的控件不知道AX控件,因此我需要显式调用该操作。它还需要使用
BeginInvoke
,因此上面的内容变成:

BeginInvoke(新动作(DoStuff))


现在工作。哎呀

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

if(InvokeRequired)
{
    Invoke(new Action(DoStuff));
}
else
{
    DoStuff();
}
当然,我从中调用的控件不知道AX控件,因此我需要显式调用该操作。它还需要使用
BeginInvoke
,因此上面的内容变成:

BeginInvoke(新动作(DoStuff))

现在工作。哎呀