Microsoft UIAutomation始终不能在某些计算机上运行。 C#

时间:2014-09-01 21:30:07

标签: c# google-chrome url ui-automation iaccessible

我有一些用于从Chrome中提取网址的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.
...
}

2 个答案:

答案 0 :(得分:0)

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

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

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

在失败的机器上,我会尝试暂时禁用UAC,如上所述here,如果它现在有效,那么你知道这就是问题所在。实际上,即使启用了UAC,也可以通过向应用程序添加清单here来使其正常运行。

答案 1 :(得分:0)

(1)您是否确认在应用程序失败的情况下Chrome已启用辅助功能?它必须从Chrome的命令行启用,或者为各个标签打开。

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

  1. 在应用程序的清单中有uiAccess = True。
  2. 通过有效的代码签名机构签署应用程序。 (您可以使用自签名的可执行文件进行测试 - 我们已成功完成此操作。)
  3. 将可执行文件安装到System32目录(或安装在64位Windows上的32位应用程序的SysWOW64)。