久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

UI自動化控制桌面應用程序并單擊菜單條

UI Automation Control Desktop Application and Click on Menu Strip(UI自動化控制桌面應用程序并單擊菜單條)
本文介紹了UI自動化控制桌面應用程序并單擊菜單條的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正在使用 UI 自動化來單擊菜單條控件.
我已經預先填充了文本框,現在也可以調用按鈕了.

I am using UI Automation to click on a Menu Strip control.
I have already pre filled the textboxes and can now invoke the button as well.

但我想遍歷菜單欄選擇一個選項讓我們說文件應該打開它的子??菜單項然后點擊一個子菜單按鈕,比如說退出.

But I would like to traverse to the Menu Bar select an option lets say File which should open its sub menu items and then click on a sub menu button, let's say Exit.

我怎樣才能實現它,下面是我的代碼,

How can I achieve it, below is my code till now,

AutomationElement rootElement = AutomationElement.RootElement;

if (rootElement != null)
{
    System.Windows.Automation.Condition condition = new PropertyCondition
        (AutomationElement.NameProperty, "This Is My Title");
    rootElement.FindAll(TreeScope.Children, condition1);
    AutomationElement appElement = rootElement.FindFirst(TreeScope.Children, condition);
    
    if (appElement != null)
    {
        foreach (var el in eles)
        {
            AutomationElement txtElementA = GetTextElement(appElement, el.textboxid);
            if (txtElementA != null)
            {
                ValuePattern valuePatternA =
                    txtElementA.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
                valuePatternA.SetValue(el.value);
                el.found = true;
            }
        }

        System.Threading.Thread.Sleep(5000);
        System.Windows.Automation.Condition condition1 = new PropertyCondition
            (AutomationElement.AutomationIdProperty, "button1");
        AutomationElement btnElement = appElement.FindFirst
            (TreeScope.Descendants, condition1);

        InvokePattern btnPattern =
            btnElement.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
        btnPattern.Invoke();

推薦答案

菜單項支持 ExpandCollapsePattern.您可以在擴展后調用子 MenuItem.這將創建 MenuItem 后代對象.如果您不展開菜單,則它沒有后代,因此沒有任何可調用的內容.
調用是使用 InvokePattern

Menu Items support the ExpandCollapsePattern. You can invoke a sub MenuItem after you have expanded it. This creates the MenuItem descendant objects. If you don't expand the Menu, it has no descendants so there's nothing to invoke.
The invocation is performd using an InvokePattern

要獲得 ExpandCollapsePatternInvokePattern ,請使用 TryGetCurrentPattern 方法:

[MenuItem].TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out object pattern)

[MenuItem].TryGetCurrentPattern(InvokePattern.Pattern, out object pattern)

如果該方法返回成功的結果,則可以調用 Expand() 和 Invoke() 方法.

If the method returns a successful result, you can then call the Expand() and Invoke() methods.

要注意 MenuBar 元素具有 Children,而 MenuItem 有 Descendants.如果您使用 FindAll() 搜索孩子的方法,你不會找到任何.

To note that a MenuBar Element has Children, while a MenuItem has Descendants. If you use the FindAll() method to search for children, you won't find any.

檢查實用程序在以下情況下非常有用編寫 UI 自動化程序.它通常位于:

The Inspect utility is quite useful when coding an UI Automation procedure. It's usually located in:

C:Program Files (x86)Windows Kits10inx64inspect.exe 

有 32 位版本可用(inx86 文件夾).

A 32bit version is available (inx86 folder).

如何進行:

  • 找到您要與之交互的應用程序的主窗口句柄:
    • Process.GetProcessesByName()(或通過 ID),EnumWindows(), FindWindowEx() 可用于獲取窗口句柄.
    • Find the handle of main Window of the Application you want to interact with:
      • Process.GetProcessesByName() (or by ID), EnumWindows(), FindWindowEx() can be used to get the Window Handle.
      • 注意SystemMenu也包含在MenuBar中,可以通過Element Name來判斷,它包含:"System"而不是 應用程序".
      • Note that the SystemMenu is also contained in a MenuBar, it can be determined using the Element Name, it contains: "System" instead of "Application".
      • 請注意,菜單項名稱和加速鍵是本地化的.

      當然,可以重復相同的操作來擴展和調用嵌套子菜單的 MenuItem.

      Of course, the same actions can be repeated to expand and invoke the MenuItems of nested Sub-Menus.

      用于查找和展開 Notepad.exe 的文件菜單并調用 Exit MenuItem 操作的示例代碼和輔助方法:

      Sample code and helper methods to find and expand the File Menu of Notepad.exe and invoke the Exit MenuItem action:

      public void CloseNotepad()
      {
          IntPtr hWnd = IntPtr.Zero;
          using (Process p = Process.GetProcessesByName("notepad").FirstOrDefault()) {
              hWnd = p.MainWindowHandle;
          }
          if (hWnd == IntPtr.Zero) return;
          var window = GetMainWindowElement(hWnd);
          var menuBar = GetWindowMenuBarElement(window);
          var fileMenu = GetMenuBarMenuByName(menuBar, "File");
      
          if (fileMenu is null) return;
      
          // var fileSubMenus = GetMenuSubMenuList(fileMenu);
          bool result = InvokeSubMenuItemByName(fileMenu, "Exit", true);
      }
      
      private AutomationElement GetMainWindowElement(IntPtr hWnd) 
          => AutomationElement.FromHandle(hWnd) as AutomationElement;
      
      private AutomationElement GetWindowMenuBarElement(AutomationElement window)
      {
          var condMenuBar = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.MenuBar);
          var menuBar = window.FindAll(TreeScope.Descendants, condMenuBar)
              .OfType<AutomationElement>().FirstOrDefault(ui => !ui.Current.Name.Contains("System"));
          return menuBar;
      }
      
      private AutomationElement GetMenuBarMenuByName(AutomationElement menuBar, string menuName)
      {
          var condition = new AndCondition(
              new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.MenuItem),
              new PropertyCondition(AutomationElement.NameProperty, menuName)
          );
          if (menuBar.Current.ControlType != ControlType.MenuBar) return null;
          var menuItem = menuBar.FindFirst(TreeScope.Children, condition);
          return menuItem;
      }
      
      private List<AutomationElement> GetMenuSubMenuList(AutomationElement menu)
      {
          if (menu.Current.ControlType != ControlType.MenuItem) return null;
          ExpandMenu(menu);
          var submenus = new List<AutomationElement>();
          submenus.AddRange(menu.FindAll(TreeScope.Descendants,
              new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.MenuItem))
                                                     .OfType<AutomationElement>().ToArray());
          return submenus;
      }
      
      private bool InvokeSubMenuItemByName(AutomationElement menuItem, string menuName, bool exactMatch)
      {
          var subMenus = GetMenuSubMenuList(menuItem);
          AutomationElement namedMenu = null;
          if (exactMatch) {
              namedMenu = subMenus.FirstOrDefault(elm => elm.Current.Name.Equals(menuName));
          }
          else {
              namedMenu = subMenus.FirstOrDefault(elm => elm.Current.Name.Contains(menuName));
          }
          if (namedMenu is null) return false;
          InvokeMenu(namedMenu);
          return true;
      }
      
      private void ExpandMenu(AutomationElement menu)
      {
          if (menu.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out object pattern))
          {
              (pattern as ExpandCollapsePattern).Expand();
          }
      }
      
      private void InvokeMenu(AutomationElement menu)
      {
          if (menu.TryGetCurrentPattern(InvokePattern.Pattern, out object pattern))
          {
              (pattern as InvokePattern).Invoke();
          }
      }
      

      這篇關于UI自動化控制桌面應用程序并單擊菜單條的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

      【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Right-click on a Listbox in a Silverlight 4 app(右鍵單擊 Silverlight 4 應用程序中的列表框)
WPF c# webbrowser scrolls over top menu(WPF c# webbrowser 在頂部菜單上滾動)
C# Console app - How do I make an interactive menu?(C# 控制臺應用程序 - 如何制作交互式菜單?)
How to add an icon to System.Windows.Forms.MenuItem?(如何向 System.Windows.Forms.MenuItem 添加圖標?)
How to avoid duplicate form creation in .NET Windows Forms?(如何避免在 .NET Windows Forms 中創建重復的表單?)
Building a database driven menu with ASP.NET, JQuery and Suckerfish(使用 ASP.NET、JQuery 和 Suckerfish 構建數據庫驅動的菜單)
主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 一区二区三区在线播放 | 91在线一区二区三区 | 福利视频一二区 | 国产精品毛片 | 999精品在线观看 | 羞羞视频网站 | 日韩欧美国产精品 | 午夜看片 | 亚洲二区精品 | 毛片在线看片 | 一区二区三区不卡视频 | 国产一区二区三区久久久久久久久 | a级免费视频| 不卡的av在线 | 三级免费毛片 | 美女视频黄的 | 国产精品一区二区三区四区五区 | 日韩精品在线观看一区二区 | 黄视频网站免费观看 | 国产精品美女久久久 | 嫩草一区二区三区 | 精品视频在线播放 | 一级片免费视频 | 色婷婷婷婷色 | 欧美日韩一区二区三区不卡视频 | 一区二区三区四区免费在线观看 | 日韩欧美一二三区 | 黄色大片网 | 夜夜爽99久久国产综合精品女不卡 | 日本在线黄色 | 色999视频 | 欧美xxxⅹ性欧美大片 | 日韩av一区二区在线 | 日韩中文字幕一区二区三区 | 久久精品无码一区二区三区 | 国产一区二区精品在线观看 | 亚洲高清一区二区三区 | 黄色毛片在线观看 | 日本特黄a级高清免费大片 国产精品久久性 | 亚洲国产精品视频 |