1

我有一些用于从 Chrome 中提取 url 的 C# 代码。它通常适用于 Win7/Win 8.1,但在某些具有相同配置的计算机上则不起作用。而且,这些配置之间可能没有区别。为什么会这样?

Process[] procsChrome = Process.GetProcessesByName("chrome");
foreach(Process chrome in procsChrome)
{
   if(chrome.MainWindowHandle == IntPtr.Zero)
   {
    continue;
   }
   AutomationElement mainWindow = AutomationElement.FromHandle(chrome.MainWindowHandle);
   elmUrlBar = mainWindow.FindFirst(TreeScope.Descendants,  new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));

  //elmUrlBar on some computers inited, on some NULL. But versions of Chrome are identical.
...
}
4

3 回答 3

0

(1) 在您的应用程序失败的情况下,您是否验证过 Chrome 中的辅助功能已打开?它要么必须从 Chrome 的命令行启用,要么为单个标签打开。

(2) 您可能违反了用户界面特权隔离 (UIPI)。如果您正在运行管理员登录,这不是问题,但使用标准登录,绕过 UIPI 的要求是:

  1. 在应用程序的清单中设置 uiAccess=True。
  2. 通过有效的代码签名机构对应用程序进行签名。(但是,您可以使用自签名的可执行文件进行测试——我们已经成功地做到了。)
  3. 将可执行文件安装到 System32 目录(或 SysWOW64 用于安装在 64 位 Windows 上的 32 位应用程序)。
于 2014-09-02T00:47:27.667 回答
0

这可能是 Windows 安全问题。Windows 中有一些安全措施可以禁用从一个应用程序到另一个应用程序的通信,称为用户帐户控制 ( UAC )。

如果您通常以管理员身份启动 Visual Studio,那么它为运行您的应用程序而生成的子进程也将被提升,并且您的自动化可能会起作用。

由于 UAC,在另一台机器上尝试可能会失败。或者它可能在禁用了某些 UAC 设置的机器上成功。

在出现故障的机器上,我会尝试暂时禁用 UAC,如此所述,如果它现在可以工作,那么您知道这就是问题所在。即使启用了 UAC,您实际上也可以通过向应用程序添加清单来使其正常工作,如此处所述

于 2014-09-01T22:49:13.773 回答
0

我在一台服务器上遇到了类似的问题,UI Automation一天工作得很好,而前几天却没有。

具有管理员权限的人添加了一些系统环境变量并重新启动了服务器。不知道他们是如何在这一步搞砸的,但在那之后我的应用程序停止了工作。

沮丧地拔了一天头发后,我决定从登录该服务器的用户帐户注销,然后重新登录。然后我运行了我的应用程序,然后bam,它开始工作了!

于 2021-08-25T20:48:43.777 回答