【发布时间】:2013-10-29 19:18:19
【问题描述】:
我有已签名的 winforms 应用程序,并且清单具有 level="requireAdministrator" uiAccess="false"。
我想启动另一个带有隐藏窗口的应用程序并使用 UI 自动化 API 来处理它。
Process procinst = new Process();
procinst.StartInfo = new ProcessStartInfo()
{
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = true,
ErrorDialog = true,
Verb = "runas",
FileName = appfilepath
};
procinst.Start();
在 Spy++ 中可以看到带有隐藏窗口的新进程,但在 UISpy 中看不到,我也无法使用 FindFirst 方法找到它:
mainwnd = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "apptitle"));
当 ProcessWindowStyle 被最小化时,一切都很好,当它被隐藏时 - 一切都停止了。
这是预期的 UI 自动化行为吗? UI 自动化无法访问隐藏窗口?有没有办法破解它?
【问题讨论】:
-
您是否尝试过明确要求隐藏窗口?
-
这是什么意思,明确的?我可以通过 FindFirst 或窗口处理程序访问窗口。 ShellExecuteEx 不返回窗口处理程序,所以我只有第一个选项。除此之外,隐藏的窗口不会在 UISpy 中显示。 UI 自动化设计可能不支持此类功能?
-
YES:您可以获得隐形窗口。枚举顶层窗口(例如使用 EnumWindows() 和 GetWindowThreadProcessId() 来检查窗口属于哪个进程),然后使用 AutomationElement.FromHandle() 获取自动化实例。
标签: automation ui-automation shellexecuteex