1

Тема: AHK: IAccessible

teadrinker пишет:
многобанофф пишет:

Я так понимаю, это подразумевает необходимость спуститься по иерархии до нужного элемента.
А можно ли достичь того же опять используя Path из Accessible Info Viewer?

Без разницы, как получать ссылку на объект, можно и так, и так. Браузер Crome не слишком удачный пример для использования IAccessible, он поддерживает этот интерфейс пока в незначительной степени. Если остались вопросы, создайте соответствующую тему.

Что есть ссылка на объект, как она выглядит в IAccessible?
Ну то есть как к примеру будет выглядеть

Description := AccObj.accDescription(varID)

применительно не к AccObj, а к его элементу, Path которого из Accessible Info Viewer 2.5.3.9?

2

Re: AHK: IAccessible

многобанофф пишет:

Что есть ссылка на объект, как она выглядит в IAccessible?

Попросту говоря, это переменная, которую можно использовать для обращения к acc-объекту. Такую переменную (AccObj) мы получаем, когда выполняем код

AccObj := Acc_ObjectFromWindow(WinExist("A"))   ; получаем ссылку на acc-объект активного окна

или

AccObj := Acc_Get("Object", "2.5.3.9", "", "A")
многобанофф пишет:

Ну то есть как к примеру будет выглядеть

Description := AccObj.accDescription(varID)

применительно не к AccObj, а к его элементу, Path которого из Accessible Info Viewer 2.5.3.9?

F10::
    AccObj := Acc_Get("Object", "2.5.3.9", "", "A")   ; получаем ссылку на acc-объект по пути 2.5.3.9 из активного окна
    if !IsObject(AccObj)
    {
        MsgBox, Не удалось получить AccObject
        return
    }

    try Description := AccObj.accDescription(0)
    MsgBox, % Description
    return

Для работы всех примеров скрипт Acc.ahk должен быть в пользовательской библиотеке.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: IAccessible

Во, благодарю, то, что надо. Как объект из окна-то получить, я скумекал. Мне было непонятно как дочерние объекты получить, теперь ясно.
А первый параметр Acc_Get, кроме значений, приведенных в разделе Accessible Info окна Accessible Info Viewer и упомянутого Object, какие-то еще значения может принимать? Вообще, я кроме той темы, откуда качал Асс.анк, нигде что-то описаний ее не нахожу. А там лаконично очень и нет ни про применение индексов в параметров функций, ни про возможные значения строковых параметров. Или может в недрах комментариев где-то пропустил?
Ага, и, наконец, посредством легкой экстраполяции обретает ясность

{
   if AccRole(AccObj) = "язычок страницы" && AccObj.accName(0) = TabName
      Return AccLocation(AccChild(AccObj, 1))
   
   for k, v in AccChildren(AccObj)
      if location := GetCloseButtonCoords(TabName, v)
         Return location
}

Поправьте, если ошибаюсь, - AccChildren возвращает ссылки на дочерние объекты, AccChild на один из них конкретный по номеру, AccLocation - координаты объекта (судя по последующим манипуляциям - левой верхней точки и относительно экрана), AccObj.accChildCount - количество дочерних.

4

Re: AHK: IAccessible

многобанофф пишет:

А первый параметр Acc_Get, кроме значений, приведенных в разделе Accessible Info окна Accessible Info Viewer и упомянутого Object, какие-то еще значения может принимать?

Я описания тоже не нашёл (точнее, не особо искал), думаю любые из этих, с которыми не нужно передавать других параметров, кроме индекса дочернего объекта. Только нужно отбросить часть "acc", например accFocus будет Focus. Но это только моё предположение, экспериментируйте.

многобанофф пишет:

AccChildren возвращает ссылки на дочерние объекты

Лучше уже тогда пользоваться нативными наименованиями этих функций, как в Acc.ahk. Acc_Children() возвращает ссылку на массив с дочерними объектами. Acc_Location() возвращает именованный список с ключами x, y, w, h.

Кстати, в GetCloseButtonCoords() строки

   if !AccObj.accChildCount
      return

лишние, их можно удалить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: IAccessible

Благодарствую, вполне ясно.

6

Re: AHK: IAccessible

teadrinker пишет:
AccObj := Acc_Get("Object", "2.5.3.9", "A")

Таки

AccObj := Acc_Get("Object", "2.5.3.9", ,"A")

Цена запятой - полтора десятка часов моей жизни, пара новых седых волос и куча полупереваренной информации.
Как в известной песне: "... совершите Вы массу открытий... иногда не желая того".

7

Re: AHK: IAccessible

А вот с

teadrinker пишет:

Метод accSelect так же:

AccObj.accSelect(flagsSelect, varID)

где flagsSelect — один или комбинация флагов отсюда.

никак не выходит. Какие бы объекты и флаги я не комбинировал, одна и та же ошибка: "0х80020005 - Несовпадение типов". Начитавшись (ну, как и ранее, в меру возможностей ) про флаги, пробовал объекты, заведомо способные быть в фокусе, но даже SELFLAG_NONE дает тот же результат. Снова прошу помощи.

8

Re: AHK: IAccessible

Чтобы хоть что-то попытаться выяснить, попытался курнуть IAccessible::get_accFocus, но параметр VARIANT structure вверг в осознание недостатка бездны познаний.

9

Re: AHK: IAccessible

Покопался в буржуйском форуме, нарыл примеров.


Acc_Children(a)[3].accSelect(ComObj(3,3),0)  

Acc.accSelect( 9,A_Index )

oLB.accSelect(TAKESELECTION,A_Index)

flags := 0x1|0x2 ; TAKEFOCUS (0x1) | TAKESELECTION (0x2)
oLV.accSelect(flags,item)

Ни так, ни сяк, ни эдак не работает.
Уверен, что ссылку на объект получаю правильно, поскольку с accDescription все получается прекрасно.
Помня, что хром - не лучший вариант, пробовал на обычных окнах. Не работает.
Не знаю, что и думать. Может какая еще библиотека требуется?

10

Re: AHK: IAccessible

Так какая задача-то конкретно?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: IAccessible

В идеале - переключение между вкладками хрома без клацанья (Click) и соответствующей обработки координат.
Достаточный минимум - перемещение фокуса из флеша на заголовок хрома (впрочем на любой элемент, главное у флеша отнять), чтобы можно было хоткеями переключаться между вкладками.
При существующем положении вещей многие флеш-приложения фокус удерживают и потому не срабатывают хоткеи не только хрома, но и даже системные. Соответственно, когда фокус у флеша, просто Ctrl+Tab или Ctrl+цифра не работают, сначала надо клацнуть по заголовку. Чем клацать по заголовку проще уж сразу по вкладке клацнуть. А мне хоткеи подавай.
Как отличить и идентифицировать области окна, куда надо бы передать фокус, я с помощью предыдущих объяснений наконец-то разобрался. Дальше думал - дело техники. Ожидаемо ошибался.

12

Re: AHK: IAccessible

Увлекся таймерами.
Тут-то есть перспективы? Намекните - я что-то неверно делаю или в принципе скорее всего недостижимо?

13

Re: AHK: IAccessible

Сейчас не могу полноценно отвечать, в отъезде до 20-го, потом напомните.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: IAccessible

Напоминаю.

15

Re: AHK: IAccessible

многобанофф пишет:

Напоминаю.

16

Re: AHK: IAccessible

Я немного не в тему, но всё же - чего в конечном итоге добиться то надо ? ) Зачем хромого ( Chrome ) мучаем ? Может истина где-то рядом ? Может и средства другие для достижения цели подобрать ? Неужели всё только для того чтоб хоткеи для вкладок всегда срабатывали ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

17

Re: AHK: IAccessible

Экий пытливый.
Истина именно там. Объясню.
Вы вот в Warface балуетесь, а я частенько в Tankionline релаксирую. Так при этом по-человечески невозможно ни обновить страницу (F5), ни другую вкладку глянуть (Ctrl+Tab), ни даже язык ввода переключить чтобы нубу глумливому в понятной ему и запрещенной правилами форме излить свое недовольство. В частности, для последнего действия нужно: открыть игровой чат, кликнуть в строку ввода, нажать кнопку windows (эта-то бестолковка везде работает), кликнуть языковую панель и нужный язык, после ввода сообщения не забыть кликнуть в окно игры.
Следует ли говорить о том, как много счастья эта процедура приносит? А если я добавлю, что все это проделывается посредством тачпада?...
Когда я коснулся IAccessible, то появилась надежда забить в один скрипт наиболее часто используемые мной веб-приложения и хоткеи, подлежащие безусловному выполнению.
Подобное и для мучающих хромого других скриптов пригодилось бы, но это уже вторично.

18

Re: AHK: IAccessible

Как говорится - "Ах вон оно чё Михалыч !" ) Ну тогда сегодня попробую поставить. Мож чего придумаю.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

19

Re: AHK: IAccessible

+ Так хром стоит вроде? А танки ставить не надо - браузерка ибо.

Настоятельно требую введения смайла "кумир"!!! Мне он насущно необходим! Немедленно!

20

Re: AHK: IAccessible

Хм... Запустил и был крайне озадачен. Языки ввода переключаются. У меня переключение на CTRL+SHIFT настроено. По умолчанию вроде как на ALT+SHIFT. Чат по CTRL+ENTER вызывается и текст туда отправляется. Видимо не совсем понял Вас. Зачем нужны манипуляции с вкладками  ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

21

Re: AHK: IAccessible

Входим в игру, вступаем в битву, пробуем управляется ли танк.
Если нет - фокус ввода не у игры и все хоткеи работают.
Если управляется - пробуем:
- Ctrl+Tab
- F5
- Enter (появится строка ввода для внутриигрового чата) и набираем текст, пробуя сменить язык.
Ничего из этого не работает.
То есть или работает, но фокус не у игры и танк не управляется, или не работает и можно играть.

22

Re: AHK: IAccessible

O_o

Сделал всё по инструкции.

1) Запустил.
2) Проверил - управляется. ( понажимал вправо и влево - танк болтает соответственно )
3) Тут же нажал CTRL+TAB - переключилась вкладка
4) F5 не сработал действительно
5) Нажал ENTER появилась строка ввода.
6) Нажал CTRL+SHIFT написал на английском. Нажал опять CTRL+SHIFT, написал на русском.

Проблем никаких не заметил. Я сейчас онлайн. Ник diqipib если что. Можем поэкспериментировать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

23

Re: AHK: IAccessible

Крайне странно. Я играю давно, сомнений, что у меня именно так происходит, быть не может. Да и прежде чем писать, еще раз удостоверился, что внезапно ночью что-то не изменилось.
Windows XP может иметь значение? Даже не представляю, что еще может...
Ах да, Shockwave Flash встроенный хромовый отключен из-за косяков постоянных и включен системный (в chrome://plugins/).
Сейчас до кучи Opera попробую.

24

Re: AHK: IAccessible

Вот что включено у меня.
http://forum.script-coding.com/misc.php?action=pun_attachment&item=664&download=0

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

25

Re: AHK: IAccessible

В опере хоткеи работают, по крайней мере язык переключается. Значит не в системе дело.
Плагины существенно не отличаются (рейдколлы и прочие оффисы, думаю, не в счет).
Ничего не понимаю.

26

Re: AHK: IAccessible

PuntoSwitcher часом не установлен ? )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

27

Re: AHK: IAccessible

Xameleon пишет:

PuntoSwitcher часом не установлен ? )

Ни в коем случае.
Вопрос переходит в статистическую плоскость - попробую проверить, не уникальна ли проблема. За сим прошу не заморачиваться ею. Если таки я не одинок и концов не найду - тогда и стану опять приставать.

28

Re: AHK: IAccessible

многобанофф пишет:

А вот с

teadrinker пишет:

Метод accSelect так же:

AccObj.accSelect(flagsSelect, varID)

где flagsSelect — один или комбинация флагов отсюда.

никак не выходит. Какие бы объекты и флаги я не комбинировал, одна и та же ошибка: "0х80020005 - Несовпадение типов". Начитавшись (ну, как и ранее, в меру возможностей ) про флаги, пробовал объекты, заведомо способные быть в фокусе, но даже SELFLAG_NONE дает тот же результат. Снова прошу помощи.

Я так понял, что Chrome этот метод не поддерживает. Для примера работы с accSelect выделение папок в эксплорере:

CoordMode, ToolTip
SetTitleMatchMode, RegEx
Run, % A_WinDir
WinWait, Windows ahk_class (Cabinet|Explore)WClass
acc := Acc_ObjectFromWindow(WinExist())

accFolderList := GetFolderList(acc)
for k, v in Acc_ChildrenByRole(accFolderList, "элемент списка")
{
   v.accSelect(1|2, 0)   ; SELFLAG_TAKEFOCUS = 1, SELFLAG_TAKESELECTION = 2
   
   oCoords := Acc_Location(v)
   ToolTip % "Name = " v.accName(0), oCoords.x, oCoords.y + oCoords.h
   Sleep, 1000
   
   if A_Index = 5
   {
      v.accDoDefaultAction(0)
      break
   }
}

GetFolderList(AccObj)
{
   if (Acc_Role(AccObj) = "список")
      Return AccObj
   
   for k, v in Acc_Children(AccObj)
      if Obj := GetFolderList(v)
         Return Obj
}

Для Chrome можно определить координаты кнопки вкладки и послать туда клик:

N := 1   ; номер вкладки
Location := Acc_Get("Location", "4.1.2.3.1." . 1 + N, 0, "ahk_class Chrome_WidgetWin_1")
RegExMatch(Location, "x(\d+) y(\d+) w(\d+) h(\d+)", Coord)
WinGetPos, X, Y,,, ahk_class Chrome_WidgetWin_1
xClick := Coord1 + Coord3//2 - X, yClick := Coord2 + Coord4//2 - Y
ControlClick, X%xClick% Y%yClick%, ahk_class Chrome_WidgetWin_1
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

29

Re: AHK: IAccessible

Благодарю за ясность.
С координатами я сам додумался. Соблазн был велик без них обойтись. Жаль.

+ По существу проблемы я в недоумении.

Пока статистики достаточной нет, но один из откликнувшихся посоветовал при нажатом Alt просто еще раз (второй) нажать Shift  и это... действительно работает. Однако, сколько при нажатом Ctrl не жму Tab - ноль эффекта. Какое-то свирепое колдунство.

30 (изменено: Malcev, 2014-05-27 12:51:36)

Re: AHK: IAccessible

AccObj := Acc_Get("Object", "2.5.3.9", "", "A")   ; получаем ссылку на acc-объект по пути 2.5.3.9 из активного окна
try Description := AccObj.accDescription(0)

А если этот путь все время меняется, можно как-то получить Description, перебирая все acc-объекты?
Цель получить msgbox когда окно программы выдаст надпись ready.

31 (изменено: serzh82saratov, 2014-05-27 13:12:02)

Re: AHK: IAccessible


Loop
    If ExistAccDescription(WinExist("A"), "ready")  
        MsgBox
    return 

ExistAccDescription(winid, Desc)
{
    if !IsObject(AccObj := Acc_ObjectFromWindow(winid))
        Return 0 ;  "Не удалось получить IAccessible"  
    Return FindAccDescription(AccObj, Desc) ? 1 : 0
}    

FindAccDescription(AccObj, Desc)
{    
    try if (AccObj.accDescription(0) = Desc)  
        Return 1

    for k, v in Acc_Children(AccObj)
        if FindAccDescription(v, Desc)  
            Return 1
}  
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

32

Re: AHK: IAccessible

Спасибо!

33 (изменено: Malcev, 2014-05-30 02:13:57)

Re: AHK: IAccessible

Что-то бьюсь-бьюсь и не получается никак сделать:
чтобы перебрав все acc-объекты и не найдя в их Description слово Ready скрипт выдал Msgbox?
И есть ли альтернатива Microsoft Active Accessibility, так-как в моем случае (Adobe Premiere CC) поле программы показывается как просто Client без Description и без Children, хотя слова в нем есть.

34

Re: AHK: IAccessible

serzh82saratov пишет:

Loop
    If ExistAccDescription(WinExist("A"), "ready")  
        MsgBox
    return 

ExistAccDescription(winid, Desc)
{
    if !IsObject(AccObj := Acc_ObjectFromWindow(winid))
        Return 0 ;  "Не удалось получить IAccessible"  
    Return FindAccDescription(AccObj, Desc) ? 1 : 0
}    

FindAccDescription(AccObj, Desc)
{    
    try if (AccObj.accDescription(0) = Desc)  
        Return 1

    for k, v in Acc_Children(AccObj)
        if FindAccDescription(v, Desc)  
            Return 1
}  

Зачем здесь Loop?

Malcev пишет:

чтобы перебрав все acc-объекты и не найдя в их Description слово Ready скрипт выдал Msgbox?


If !ExistAccDescription(WinExist("A"), "ready")  
    MsgBox
return 

ExistAccDescription(winid, Desc)
{
    static AccObj
    if !AccObj
        if !AccObj := Acc_ObjectFromWindow(winid)
            Return 0 ;  "Не удалось получить IAccessible"  
    Return FindAccDescription(AccObj, Desc) ? 1 : 0
}    

FindAccDescription(AccObj, Desc)
{    
    try if (AccObj.accDescription(0) = Desc)  
        Return 1

    for k, v in Acc_Children(AccObj)
        if FindAccDescription(v, Desc)  
            Return 1
}  
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

35

Re: AHK: IAccessible

Спасибо!
Мне надо чтобы скрипт сначала проверил есть ли такой Description вообще.
Если нету, то выдал msgbox.
Если же есть, то он ждал бы пока его State станет invisible и тогда выдал бы msgbox.
В итоге получилась простыня, уверен, что можно короче.

f11::
If !NotExistAccDescription(WinExist("A"), "ready")  
   MsgBox Not Exist

Loop
   If ExistAccDescription(WinExist("A"), "ready")  
      MsgBox Exist


NotExistAccDescription(winid, Desc)
{
    static AccObj
    if !AccObj
        if !AccObj := Acc_ObjectFromWindow(winid)
            Return 0 ;  "Не удалось получить IAccessible"  
    Return NotFindAccDescription(AccObj, Desc) ? 1 : 0
}     

NotFindAccDescription(AccObj, Desc)
{    
    try if instr(AccObj.accDescription(0), Desc)
        Return 1

    for k, v in Acc_Children(AccObj)
        if NotFindAccDescription(v, Desc)  
            Return 1
}  


ExistAccDescription(winid, Desc)
{
    if !IsObject(AccObj := Acc_ObjectFromWindow(winid))
        Return 0 ;  "Не удалось получить IAccessible"  
    Return FindAccDescription(AccObj, Desc) ? 1 : 0
} 

FindAccDescription(AccObj, Desc)
{    
    try if instr(AccObj.accDescription(0), Desc) and (AccObj.accState(0), "invisible")
        Return 1

    for k, v in Acc_Children(AccObj)
        if FindAccDescription(v, Desc)  
            Return 1
}  

36

Re: AHK: IAccessible

F11::
If !ExistAccDescription(hWnd := WinExist("A"), "ready")
{
    MsgBox, нет
    While !ExistAccDescription(hWnd, "ready")
        Sleep, 1000
}
MsgBox, есть
return 

ExistAccDescription(winid, Desc)
{
    static AccObj
    if !AccObj
        if !AccObj := Acc_ObjectFromWindow(winid)
            Return 0 ;  "Не удалось получить IAccessible"  
    Return FindAccDescription(AccObj, Desc) ? 1 : 0
}    

FindAccDescription(AccObj, Desc)
{    
    try if (AccObj.accDescription(0) = Desc)  
        Return 1

    for k, v in Acc_Children(AccObj)
        if FindAccDescription(v, Desc)  
            Return 1
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

37

Re: AHK: IAccessible

Спасибо, но тут нету ни слова о:

Если же есть, то он ждал бы пока его State станет invisible и тогда выдал бы msgbox.

   

try if instr(AccObj.accDescription(0), Desc) and (AccObj.accState(0), "invisible")

38

Re: AHK: IAccessible

Ой, плохо посмотрел, с телефона пишу . Попозже.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

39

Re: AHK: IAccessible

Как-то так:

F11::
   If !AccObj := ExistAccDescription(WinExist("A"), "ready")
      MsgBox, нет
   else
   {
      While Acc_State(AccObj) != "invisible"
         Sleep, 1000
      MsgBox, invisible
   }
   return 

ExistAccDescription(winid, Desc)
{
   if (!(AccObj := Acc_ObjectFromWindow(winid)) && Error := "Не удалось получить IAccessible")
      Return 0, DllCall("MessageBox", Ptr, 0, Str, Error, Str, "", UInt, 0) 
   Return FindAccDescription(AccObj, Desc)
}    

FindAccDescription(AccObj, Desc)
{    
   try if (AccObj.accDescription(0) = Desc)  
      Return AccObj

   for k, v in Acc_Children(AccObj)
      if AccObj := FindAccDescription(v, Desc)  
         Return AccObj
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

40

Re: AHK: IAccessible

Спасибо! То, что надо.

41 (изменено: fwant, 2014-07-23 14:42:22)

Re: AHK: IAccessible

Добрый день!
Столкнулся с такой проблемой: В программе задана таблица, необходимо взять 10ый элемент каждой строки. Обычным методом не получается, только через IAccessible. Докопал до адреса, но нельзя задать переменную в куске Path:

AccObj := Acc_Get("Object", "4.4.4.1.4.2.4.1.4.1.4.2.4.1.4.4.10" , ,"A")
case2 := AccObj.accvalue(0)
AccObj := Acc_Get("Object", "4.4.4.1.4.2.4.1.4.1.4.2.4.1.4.5.10" , ,"A")
case3 := AccObj.accvalue(0)

Меняется только предпоследняя строка.
При использовании переменной как части строки, либо целиком строчкой,  не получается получить данное значение:

AccObj := Acc_Get("Object", var , ,"A")
AccObj := Acc_Get("Object", "%var%" , ,"A")
AccObj := Acc_Get("Object", %var% , ,"A")
AccObj := Acc_Get("Object", "4.4.4.1.4.2.4.1.4.1.4.2.4.1.4.%var%.10" , ,"A")

Не выдают значение.

42

Re: AHK: IAccessible

IAccessible здесь не при чём. Нужно просто знать правила передачи параметров в функцию.
Переменная: MyFunc(var)
Строка: MyFunc("string")
Строка с переменной: MyFunc("string" . var)
Переменная внутри строки: MyFunc("part1" . var . "part2")

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

43 (изменено: fwant, 2014-07-23 16:10:50)

Re: AHK: IAccessible

Большое спасибо.