使用服务中的UIAutomation

时间:2013-04-17 19:14:55

标签: c# .net microsoft-ui-automation

我有使用UIAutomation的代码可以在控制台应用程序中查找,但我需要它作为服务运行。此服务负责确保在给定计算机上运行3个exes并且正确配置它们。没有COM或.net入口指向用C ++编写的exe。

var k = Process.GetProcessesByName("genericEXE");
                foreach (var win in k)
                {
                    List<string> scol = new List<string>();

                    AutomationElement cpc = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ProcessIdProperty, win.Id));
                    if (cpc == null)
                        continue;
                    WalkEnabledElements(cpc, scol);
                    if (scol.Contains("COM1") && scol.Contains("COM2") && scol.Contains("COM3") && scol.Contains("COM4") && scol.Contains("COM5"))
                        foundCom1 = true;
                    if (scol.Contains("COM6") && scol.Contains("COM7") && scol.Contains("COM8") && scol.Contains("COM9") && scol.Contains("COM10"))
                        foundCom6 = true;
                    if (scol.Contains("COM11") && scol.Contains("COM12") && scol.Contains("COM13") && scol.Contains("COM14") && scol.Contains("COM15"))
                        foundCom11 = true;


                }



static void WalkEnabledElements(AutomationElement rootElement, List<string> col)
        {
            TreeWalker walker = new TreeWalker(Condition.TrueCondition);
            AutomationElement elementNode = walker.GetFirstChild(rootElement);
            while (elementNode != null)
            {
                Console.WriteLine(elementNode.Current.Name);
                col.Add(elementNode.Current.Name);
                WalkEnabledElements(elementNode, col);
                elementNode = walker.GetNextSibling(elementNode);
            }
        }

我已经尝试将该服务作为运行时登录的同一用户运行,尝试作为本地服务运行w /打开桌面位。我从来没有从

中获得AutomationElement
AutomationElement cpc = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ProcessIdProperty, win.Id)); 

线。任何人都知道我需要采取哪些不同的做法?

1 个答案:

答案 0 :(得分:1)

如果您运行Vista或更高版本,则出于安全原因,始终在会话0中创建服务,该会话与任何用户会话分开。您无法在会话之间共享UI元素或来回发送消息,这可能是您的自动化内容无法正常工作的原因。仅仅因为服务作为特定用户运行并不意味着其进程在同一会话中运行。即使没有人登录,服务也必须继续运行,因此必须在他们自己的会话中创建它们。

作为一种解决方法,我认为可以使用CreateProcessAsUser在用户会话中生成另一个进程。然后,您需要使用进程间通信(例如,通过管道的WCF)来从您的服务中操作它。听起来很乱。更好的选择可能是忘记服务并坚持使用控制台应用程序。