1

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

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 cpc = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ProcessIdProperty, win.Id)); 

线。有人知道我需要做些什么不同的事情吗?

4

1 回答 1

1

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

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

于 2013-04-17T19:45:48.407 回答