2015-05-30 57 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