Действие accDoDefaultAction объекта IAccessible игнорируется ROLE_SYSTEM_PUSHBUTTON - PullRequest
0 голосов
/ 06 апреля 2020

В настоящее время я работаю с IAccessible и попробуйте автоматически щелкнуть и выполнить некоторые действия.

Он отлично работает для нескольких кнопок, кнопок Splitbutton и других.

Последний элемент - Windows Настройка системы, которая является ROLE_SYSTEM_PUSHBUTTON.

accDoDefaultAction, игнорируется, так же как SendMessage и PostMessage для дескриптора окна.

Пустой код:

private void SetAutoSettingTest()
{
  var RootWindowses = GetWindowsByName("Settings", "ApplicationFrameWindow");
  foreach (var RootWindows in RootWindowses) {
      var AccessableChild = MSAA.GetAccessibleObjectFromHandle(RootWindows.windowHandle);
      var IAccessibleLinkList = new List<IAccessible>();
      MSAA.GetAccessibleObjectListByRole(AccessableChild, "PushButton", ref IAccessibleLinkList, true);
      foreach (var IAccessibleCheckButton in IAccessibleLinkList) {
         AppendLog("Item in Settings AccessableButtonList (found)");
         if (IAccessibleCheckButton.get_accName(0).Equals("MySetting"))
            // it found the proper IAccessible Object. Verified 
            {
            Thread.Sleep(1000); // Just waited if the dialog was not finished WM_PAINT
            IAccessibleCheckButton.accSelect(0); // Was just a try, but didnt help
            IAccessibleCheckButton.accDoDefaultAction(0); // Is ignored
            var MyHandle = MSAA.GetHandle(IAccessibleCheckButton);
            AppendLog("HWND=" + MyHandle );  // It was a IntPtr (HWND)
            int IAccessibleLeft = 0, IAccessibleTop = 0, IAccessibleWidth = 0, IAccessibleHeight = 0;
            IAccessibleCheckButton.accLocation(out IAccessibleLeft, out IAccessibleTop, out IAccessibleWidth, out IAccessibleHeight, 0);
            Win.ShowWindow(RootWindows.windowHandle, Win.SW_SHOW); // just in cae it was minimized
            Win32.BringWindowToTop(MyHandle ); // just in case the Element to toggle was somehow in background
            Win.SetCursorPos(IAccessibleLeft, IAccessibleTop); // Used Mousepos and clicks which works, but not a clean solution
            Win.mouse_event(Win.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
            Win.mouse_event(Win.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
            AppendLog(String.Format("Location Left {0} Top {1} Width {2} Height {3}", IAccessibleLeft, IAccessibleTop, IAccessibleWidth, IAccessibleHeight)); // valid data
            }
         }
     }
} 

Возвращает HWND, но даже PostMessage для HWND игнорируется.

Роль ROLE_SYSTEM_PUSHBUTTON, состояние STATE_SYSTEM_FOCUSABLE и childId CHILDID_SELF. Это означает, что к нему можно получить доступ и обычно переключать. Это не только для чтения.

...