2015-05-30 54 views
3

我得到了一個在另一個應用程序中作爲進程外插件運行的dll。插件中的Windows窗體

當主應用程序調用我的插件時,我的代碼在我的插件的appdomain內的線程池線程(我認爲)中運行。這是一個MTA線程。

我的問題是什麼是在我的插件中顯示消息框/對話框的正確方法?

我發現的大多數答案只是說對話框應該在「GUI線程」中打開,但我的appdomain中沒有GUI線程!試圖尋找GUI線程的定義,但找不到任何東西。一些提示說這是執行Application.Run的線程。

我試過的只是創建一個STA線程並在那裏打開消息框/對話框。它似乎大部分時間工作,但偶爾在ShowDialog方法內我得到一個奇怪的100%CPU使用率。

我應該在自己的應用程序域中開始與Application.Run的消息循環嗎?它應該在回調期間運行,還是創建/拆卸開銷很大,因此我應該在開始時創建並始終運行它?

(我有機會到我作爲家長/所有者使用主應用程序的窗口句柄)

+0

您插入的appliaction是否提供API來顯示對話框? – CodeCaster

+0

@CodeCaster,不幸的不是。 – adrianm

+0

我認爲'ShowDialog'不是你的DLL工作。您可以提供一個可以通過調用應用程序顯示的消息(例如函數返回值)。或創建可通過調用應用程序連線的事件 – Fabio

回答

1

嘗試用Win API NativeMethods:

/// Direct Task Dialog call. [DllImport("comctl32.dll", CharSet = CharSet.Unicode, EntryPoint = "TaskDialog")] public static extern int TaskDialog(IntPtr hWndParent, IntPtr hInstance, string pszWindowTitle, string pszMainInstruction, string pszContent, int dwCommonButtons, IntPtr pszIcon, out int pnButton);

你可以找到很好的用在這裏例如: https://code.google.com/p/cassini/

+0

謝謝你的回答,但不明白它如何回答這個問題。我應該從哪個線程打開任務對話框?標準線程池MTA線程,我自己創建的STA線程? – adrianm

+0

使用STA模型。看到相關的答案:http://stackoverflow.com/questions/127188/could-you-explain-sta-and-mta – gogosweb

+0

所以你的意思是創建一個STA線程,並在那裏打開任務對話框。這就是我現在要做的,但是我打開了正常的消息框。爲什麼Task對話框在MessageBox不工作的地方工作。 (我試圖用相同的結果調用本機win32消息框) – adrianm