【问题标题】:Determine if a dialog is showing确定是否显示对话框
【发布时间】:2014-04-02 05:45:15
【问题描述】:

在我的 WPF 应用程序中,我有多个类,每个类 implements a message loop。当我创建这些类的对象时,所有这些消息循环都会并行运行。这些对象有时可能会显示一个对话框。主应用程序线程必须密切关注这些对象,并确保它们都不会被对话框卡住(如果确定这种情况,请按取消(退出键))。确定线程的活动前台窗口的正确方法是什么?我知道有一个GetForegroundWindow() API,但它看起来好像在系统级别而不是线程级别工作。

【问题讨论】:

  • 您能否进一步解释一下“主应用程序线程必须密切关注这些对象并确保它们都不会卡在对话框中(如果确定这样,请按取消(Escape 键)例)。”
  • 没有上下文似乎是一个糟糕的解决方案。为什么您需要多个消息循环,尤其是因为这些循环似乎在进行用户交互?
  • 这基本上是一个自动化测试场景。这些类中的每一个都包含一个WebBrowser,它会打开我们的 ASP.NET 网站的特定页面并填写这些页面上的表单。某些页面有时会显示OpenFileDialog,我们希望摆脱(或有时提供值)。
  • @dotNET 只有一个 GUI 线程,所以这意味着所有打开的窗口都属于该线程,这意味着 GetForegroundWindow 在进程级别和线程级别都是相同的。这是据我所知。
  • @o_weisman:这并不完全正确。我的每个班级都有这个:thread = new Thread(() => { Application.Run(); }); 在其中(请参阅我已链接的 Hans Passant 的答案),因此在我的应用程序中可能同时显示多个对话框。虽然这只是我的理论,可能是错误的。

标签: c# .net wpf multithreading winapi


【解决方案1】:

没有每线程活动的前台窗口。因此,您明确要求的内容没有答案。

至少使用 Win32 可能正确的方法是使用 EnumWindows 枚举顶级窗口。然后使用GetWindowThreadProcessId 确定该窗口与您的线程之一相关联。最后使用GetClassName 来识别该窗口是一个文件对话框。然后随意对窗口做任何你想做的卑鄙的事情!

另一方面,这听起来像是 UIAutomation 的完美候选者。您正在自动化 UI 测试。 UIAutomation 将能够找到这些文件对话框窗口并按下它们上的按钮。

【讨论】:

  • 非常感谢。我会试一试。 UIAutomation 听起来很吸引人。链接(Google 提供了很多结果,但所有结果都在 UI 和自动化之间留有空格)?
猜你喜欢
  • 2017-05-10
  • 2017-10-04
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2021-06-28
相关资源
最近更新 更多