2010-07-12 35 views
1

我有一個應用程序,其中我在託管類型的應用程序中託管多種類型的內容(圖像,PowerPoint演示文稿,視頻等)。用戶必須能夠在這些內容位之間來回翻頁,優選地使用售貨機上的觸摸屏的手勢,即,輕擊屏幕的一側以前進,另一側返回。Winforms/ActiveX跨線程調用

不幸的是,顯示內容的控件可能會有進一步的嵌套,所以我使用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沒有成功。我用的是典型的WinForms跨線程模式

回答

1

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

當然,我從調用控件沒有的AX控制的想法,所以我需要顯式調用的動作。它還需要使用BeginInvoke,因此上述變成:

BeginInvoke(new Action(DoStuff));

現在工程。哎呀!