В настоящее время я работаю с 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
. Это означает, что к нему можно получить доступ и обычно переключать. Это не только для чтения.