我有一个简单的功能,就像这样:
let possibleParents:Seq<Process> = GetProcessesByExecutableFileName(exeName)
let el = match possibleParents with
| x when x.Where(fun y -> y.MainWindowHandle > IntPtr.Zero).Count() = 1 -> AutomationElement.FromHandle <| Seq.head possibleParents // Only works if no tooltips or menus are open
| x when x.Where(fun y -> y.MainWindowHandle > IntPtr.Zero).Count() < 1 -> AutomationElement.FromHandle <| Win32.FindWindowByProcess exeName //ALWAYS works
| x when x.Count() > 1 -> AutomationElement.RootElement // start search from Desktop
| _ -> null
因此,当从.NET获取Process对象时,如果有任何菜单\ contextmenus,工具提示或组合框打开,它将返回IntPtr.Zero。只要将鼠标从工具提示移开,它就会返回一个真实的IntPtr值。
这是为什么?我能理解mdi children&amp;导致此问题的其他窗口层次结构,但不是简单地将鼠标悬停在工具提示上。 user32.dll导入了什么来查找Process类以不同方式执行的句柄?
欢迎使用F#,C#或VB.NET中的答案。