【问题标题】:Windows forms in a plugin插件中的 Windows 窗体
【发布时间】:2015-11-04 18:38:16
【问题描述】:

我有一个 dll,它在另一个应用程序中作为进程外插件运行。

当主应用程序调用我的插件时,我的代码在插件的 appdomain 内的线程池线程(我认为)中运行。这是一个 MTA 线程。

我的问题是在我的插件中显示消息框/对话框的正确方法是什么?

我发现的大多数答案只说对话框应该在“GUI 线程”中打开,但我的 appdomain 中没有 GUI 线程!尝试搜索 GUI 线程的定义,但找不到任何东西。一些提示说它是执行Application.Run 的线程。

我尝试的是创建一个 STA 线程并在那里打开消息框/对话框。它似乎大部分时间都在工作,但偶尔我会在 ShowDialog 方法中得到一个奇怪的 100% CPU 使用率。

我应该在我自己的 appdomain 中使用Application.Run 开始一个消息循环吗?它应该只在回调期间运行,还是创建/拆卸成本很高,所以我应该在开始时创建它并让它一直运行?

(我可以访问我用作父/所有者的主应用程序的窗口句柄)

【问题讨论】:

  • 您插入的应用程序不提供 API 来显示对话框吗?
  • @CodeCaster,很遗憾没有。
  • 我认为 ShowDialog 不是你的 dll 工作。您可以提供可以通过调用应用程序显示的消息(例如函数返回值)。或者创建可以通过调用应用程序连接的事件
  • @adrianm 我同意上面的 Fabio ...有效地提供允许对话交互的 API。

标签: c# winforms


【解决方案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/

【讨论】:

  • 感谢您的回答,但不明白它是如何回答问题的。我应该从哪个线程打开任务对话框?标准线程池 MTA 线程,我自己创建的 STA 线程?
  • 使用 STA 模型。查看相关答案:stackoverflow.com/questions/127188/…
  • 所以你的意思是创建一个 STA 线程并在那里打开任务对话框。这就是我现在所做的,但我打开了普通的消息框。为什么任务对话框应该在 MessageBox 不能工作的地方工作。 (我尝试调用原生win32消息框,结果相同)
猜你喜欢
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多