1 (изменено: elektrovenik, 2015-04-10 18:40:03)

Тема: AHK: Сравнение значений строки состояния программы и операции с ними

Столкнулся со следующей проблемой:

+ открыть спойлер
Torrent := "AHK_exe utorrent.exe"
while WinExist(Torrent)
{
StatusBarGetText, DL, 4, %Torrent%
Gosub, Chek
sleep 5000
}
return

Chek:
Loop, parse, DL, %A_Tab%%A_Space%
{
If A_Index=2
speed := A_LoopField
If A_Index=3
tipspeed := A_LoopField
Gosub, Chek2
}
return

Chek2:
If tipspeed = "МБ/с"
SoundPlay, C:\Windows\Media\tada.wav
else
{
Gosub, Chek3
}
return

Chek3:
If speed < 300
{
действия по перезапуску закачки
}
return

Но скрипт работает некорректно. Начал прогонять участки скрипта для поиска ошибки и обнаружил следующее:
Для примера переменной DL присвоена строка

П: 1.5 КБ/с В: 5.3 МБ

, на деле вид строки тот же, числа разумеется различные. Делаю парсинг по пробелам и табуляциям и проверяю командой MsgBox:

DL := "П: 1.5 КБ/с В: 5.3 МБ"

F5::
Loop, parse, DL, %A_Tab%%A_Space%
{
MsgBox, %A_Index%: %A_LoopField%
}
return

В результате выдается 6 подстрок:

1: П:
2: 1.5
3: КБ/с
4: В:
5: 5.3
6: МБ

Проверка осуществляется по подстрокам №3 и №2. Тут надо оговориться почему:
Если значение переменной tipspeed = "МБ/с", то меня это устраивает, значит скорость нормальная. Если равенство нарушается, значит скачивание уже явно идет в КБ/с и мы отправляемся на проверку условия

If speed < 300

То есть если скорость закачки опустилась ниже 300Кб/с, то меня это не устраивает и выполняется нажатие кнопок управления для перезапуска закачки. По идее все должно работать, но нет, тогда проверяю таким образом:

DL := "П: 1.5 КБ/с В: 5.3 МБ"

F5::
Loop, parse, DL, %A_Tab%%A_Space%
{
If A_Index=2
speed := A_LoopField
If A_Index=3
tipspeed := A_LoopField
Gosub, Showmix
}
return

Showmix:
Send %tipspeed%
sleep 1000
Send %speed%
return

И тут шок, результат такой (для наглядности разделил пробелами):

КБ/с 1.5 КБ/с 1.5 КБ/с 1.5 КБ/с 1.5 КБ/с 1.5 КБ/с 1.5

Видно, что переменная tipspeed и speed были напечатаны по 6 раз каждая. Вопрос почему? Естественно на уме всплывает, что в результате парсинга получилось 6 подстрок, но ведь я четко указываю при каком круге цикла парсинга какое значение подстроки присваивать переменным:

Loop, parse, DL, %A_Tab%%A_Space%
{
If A_Index=2
speed := A_LoopField
If A_Index=3
tipspeed := A_LoopField

Подскажите, что я делаю не так? А то уже крыша едет и все бесит(

2 (изменено: Irbis, 2015-04-10 20:02:05)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Если не вдаваться в то, что весь код надо переделать, по отдельно взятой проблеме - у вас Send срабатывает при каждой итерации внутри цикла, а надо лишь при третьей.

DL := "П: 1.5 КБ/с В: 5.3 МБ"

F5::
Loop, parse, DL, %A_Tab%%A_Space%
{
   If A_Index=2
      speed := A_LoopField
   If A_Index=3
   {
      tipspeed := A_LoopField
      Gosub, Showmix
      Break
   }
}
return

Showmix:
Send %tipspeed%
sleep 1000
Send %speed%
return

Проще так распарсить:

DL := "П: 1.5 КБ/с В: 5.3 МБ"

F5::
   Arr := StrSplit(DL, " ")
   MsgBox % Arr[2] . "  " . Arr[3]
return

3 (изменено: elektrovenik, 2015-04-10 20:20:03)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Irbis, если не затруднит, то попрошу Вас написать правильный код для решения поставленной задачи. В приоритете решение главной задачи, а не отдельной проблемы с Send. Хочу посмотреть на правильную реализацию и разобрать вместе с Вами непонятные нюансы.
P.S.

+ открыть спойлер

Кажется дошло, используя такое построение кода

F5::
Loop, parse, DL, %A_Tab%%A_Space%
{
If A_Index=2
speed := A_LoopField
If A_Index=3
tipspeed := A_LoopField
Gosub, Showmix
}
return

Количество итераций цикла равняется количеству распарсенных подстрок из переменной DL? Я просто привык, к классическим (простейшим) применениям команды Loop и решил, что в данном случае строка кода

Loop, parse, DL, %A_Tab%%A_Space%

выполняется сразу, а все что ниже в скобках, это есть приклепленный блок действий, ну все-равно что

If M = 1
{
Действие 1
Действие 2
Действие 3
}
else
{
Действие 4
}
return
DL := "П: 1.5 КБ/с В: 5.3 МБ"

F5::
   Arr := StrSplit(DL, " ")
   MsgBox % Arr[2] . "  " . Arr[3]
return

Вариант распарса, который Вы предложили вообще не понимаю, может поясните?)

Незнание языка и синтаксиса просто убивает. Может дадите совет, как можно выучить язык, а лучше его понять? У меня обучение языку получается в основном методом разбора уже готовых скриптов, понимая что к чему и за чем, а потом уже "по шаблону" решаю свои задачи. Пробовал например залпом читать справку, но это ничего не дает. Появляется понимание о командах/функциях, но прихода идей реализации не наблюдается( Вот данный случай тому пример, я почти все скрипты связанные с изменением чего-то и ответными действиями реализую через ImageSearhc или PixelSearch, но будем откровенны - это уровень дилетанта. А Вы предложили изящное решение через чтение строки программы. Мне кажется идеалом было бы чтение адреса памяти и взятие значения оттуда, но там свои трудности связанные с постоянно меняющимся значением и оттого поймать адрес крайне трудно.

4

Re: AHK: Сравнение значений строки состояния программы и операции с ними

На мой взгляд, самый эффективный метод - начинать с простых примеров, брать построчно и каждую команду или функцию смотреть в справке, тем более в ней самой примеров хватает. Лучше пользоваться встроенной английской, но для начала (основы) подойдет перевод справки на форуме.
StrSplit() просто разбивает строку (первый параметр) на элементы, и заполняет ими массив. В нашем примере имя массива Arr, и тогда Arr[1], Arr[2] и т.д. - его элементы.

Прямое чтение из памяти как раз не идеальный вариант, не только от смены адреса в памяти, вообще в силу многих причин такие способы лучше оставлять на крайний случай.

Попробуй такой вариант скрипта. В переменной N счетчик количества замеров скорости, когда она меньше нужной (300 КБ/с). При 4х подряд происходит перезапуск (2ой MsgBox), Если таких замеров больше 12 подряд - сообщение или действие (1ый MsgBox). Добавил постановку на паузу по хоткею (F12).

Torrent := "AHK_exe utorrent.exe", N:=0
while WinExist(Torrent) {
   sleep 5000
   StatusBarGetText, DL, 4, %Torrent%
   Arr:= StrSplit(DL, " ")
   if (Arr[2]<300)&&(Arr[3]<>"МБ/с")
      Gosub Restart
   Else
      N:=0
}
return

Restart:
   if (++N>11) {
      MsgBox Низкая скорость - не исправлено.
      N:=0
   }
   if !Mod(N,4) {
      MsgBox Перезапуск закачек
   }
Return
F12:: Pause

5 (изменено: elektrovenik, 2015-04-11 14:17:03)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Браво, Irbis, Ваш код отлично работает. К сожалению, не пойму где в скрипте код отвечающий за запуск каунта N (++N), вижу только N:=0 (присвоение значения переменной); (++N>11); !Mod(N,4) (это все условия). На мой взгляд должна присутствовать строка каунта где-то тут, без этого ведь не должен запускаться счетчик:

Torrent := "AHK_exe utorrent.exe", N:=0
while WinExist(Torrent) {
   sleep 5000
   StatusBarGetText, DL, 4, %Torrent%
   Arr:= StrSplit(DL, " ")
   if (Arr[2]<300)&&(Arr[3]<>"МБ/с")
{
      N++
      Gosub Restart
}
   Else
      N:=0
}
return

Или же язык допускает возможность совмещения запуска таймера и условия одновременно и это оно и есть

if (++N>11)

? Так же поясните пожалуйста это условие

if !Mod(N,4)

- не могу найти в справке что за Mod и почему идет отрицательное/обратное значение (!)


Еще не понимаю одного момента:
Вожусь со своим кодом, чтобы понять чем он плох и как-бы выжать максимум и столкнулся с проблемой

+ открыть спойлер
exe := "AHK_exe utorrent.exe"
while WinExist(exe)
{
    sleep 5000
    StatusBarGetText, DL, 4, %exe%
    Loop, parse, DL, %A_Tab%%A_Space%
        {
            If A_Index=2
            speed := A_LoopField
            If A_Index=3
                {
                    tipspeed := A_LoopField
                    Gosub, Chek
                    break
            }}}
return

Chek:
If tipspeed = "КБ/с"
SoundPlay, C:\Windows\Media\tada.wav
else
{
If speed < 100
{
MsgBox, перезапуск закачки
}
}
return

Так вот, он работает на половину: условие

If speed < 100

прекрасно выполняется и проверяется, а вот условие

If tipspeed = "КБ/с"
SoundPlay, C:\Windows\Media\tada.wav

не хочет выполняться, в чем может быть косяк?

6 (изменено: Irbis, 2015-04-11 14:49:35)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Mod() Деление по модулю, остаток от целочисленного деления одного числа на другое. Mod(N,4) возвращает 0 при N кратном 4, поэтому для выполнения условия используется отрицание (!), чтобы перезапуск выполнялся каждый 4й раз.

Математические операции (в том числе преинкремента ++N) можно совмещать с другими операциями, но на этапе ознакомления проще все писать последовательно, чтоб не запутаться. )
Можно этот код и так записать, для краткости.

while WinExist(Tor:="AHK_exe utorrent.exe")
   DllCall("Sleep", UInt, 5000), R(Tor)
return
R(Tor){
   Static N:=1
   StatusBarGetText, DL, 4, %Tor%
   Arr:=StrSplit(DL, " "), N:=1+N*((Arr[2]<300)&&(Arr[3]<>"МБ/с"))
   if (N>11)&&(N:=1){
      MsgBox Низкая скорость - не исправлено.
   } if !Mod(N,4){
      MsgBox Перезапуск закачек
}}
F12:: Pause

По поводу сравнений, надо так:

If (tipspeed = "КБ/с")

или можно так

If tipspeed = КБ/с

7 (изменено: elektrovenik, 2015-04-11 14:59:27)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Irbis пишет:

Mod() Деление по модулю, остаток от целочисленного деления одного числа на другое. Mod(N,4) возвращает 0 при N кратном 4, поэтому для выполнения условия используется отрицание (!), чтобы перезапуск выполнялся каждый 4й раз.

Математические операции (в том числе преинкремента ++N) можно совмещать с другими операциями
По поводу сравнений, надо так:

If (tipspeed = "КБ/с")

или можно так

If tipspeed = КБ/с

Здорово, теперь все встает на свои места. Вы действительно Мастер, не только потому, что можете грамотно написать код, но и потому, что можете понятно объяснить даже новичку, вроде меня.
Ну а это построение кода конечно далеко не для моего уровня.

+ открыть спойлер
while WinExist(Tor:="AHK_exe utorrent.exe")
   DllCall("Sleep", UInt, 5000), R(Tor)
return
R(Tor){
   Static N:=1
   StatusBarGetText, DL, 4, %Tor%
   Arr:=StrSplit(DL, " "), N:=1+N*((Arr[2]<300)&&(Arr[3]<>"МБ/с"))
   if (N>11)&&(N:=1){
      MsgBox Низкая скорость - не исправлено.
   } if !Mod(N,4){
      MsgBox Перезапуск закачек
}}
F12:: Pause

8 (изменено: elektrovenik, 2015-04-11 16:53:32)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Всплыл еще один момент, раз уж доводить до ума скрипт:
Хочется сделать клик по элементам управления не через координаты, а через контролы. Почитал справку по ControlClick, сначала пробовал так

ControlClick, Остановить торрент, ahk_exe uTorrent.exe

Не проходит. Затем стал биться через Class NN и кое чего добился:

ControlClick, ToolbarWindow322, ahk_exe uTorrent.exe

- происходит клик по кнопке, которая идет следом за кнопкой остановки закачки. Как следует из справки после Class NN надо указать номер элемента управления, но как всегда не приведено примера как это правильно сделать (на то она и справка). Я посмотрел номер элемента управления через программу AhkSpy

+ открыть спойлер

http://i6.5cm.ru/i/jr3i.jpg

И пробовал такие варианты:

+ открыть спойлер
ControlClick, ToolbarWindow322 10, ahk_exe uTorrent.exe
ControlClick, ToolbarWindow322:10, ahk_exe uTorrent.exe
ControlClick, ToolbarWindow322-10, ahk_exe uTorrent.exe
ControlClick, ClassNN: ToolbarWindow322; id: 10, ahk_exe uTorrent.exe
ControlClick, ToolbarWindow322id10, ahk_exe uTorrent.exe
ControlClick, ToolbarWindow322 id10, ahk_exe uTorrent.exe

и наверное даже какие-то еще, но не выходит. Вообщем снова прошу Вас подсказать, как верно записать.


  • Тут отдельная часть, хочется чтобы прочли побольше людей.

У меня уже давно бомбит от "полезности" справки, в ней частенько приведена в пример (простите за мой французский) байда общего характера, без конкретных, полезных применений.
В данном случае:

ControlClick, OK, Некоторый заголовок окна ; Кликнуть кнопку OK в окне с заголовком «Некоторый заголовок окна»
ControlClick, x55 y77, WinTitle ; Кликнуть по указанным координатам. Обратите внимание на отсутствие запятой между X и Y.

Дааа, это ужас как сложно додуматься... А вот такую легкоту, как Class NN мы не опишем, зачем? Зато погуглив наткнулся на иностранный форум и обсуждение, в которых есть такие примеры:

ControlClick("[CLASS:#32770]", "", "[CLASSNN:SysTreeView321; ID:1439]", "", "", "31", "201")
ControlClick(WinGetTitle("[Class:#32770]"), "", "SysTreeView321", "left", 1, 31, 201)
If above does not work try
ControlClick("", "", "SysTreeView321", "left", 1, 31, 201)
ControlClick("[CLASS:#32770]", "", "[CLASSNN:SysTreeView321; ID:1439]", "left", 1, 31, 201)

О да, вот это легкотень, дибил поймет. Такую легкоту писать - только справку портить.
Я конечно прошу прощения, но уже сил никаких нет, на кой нужна справка, если в ней не описывается нормальных примеров? Как человек должен понять строчку:

Режим 2 (ClassNN или Текст): укажите необходимый ClassNN (имя класса и номер элемента управления)

и догадаться, что имя класса и номер управления должны быть записаны как-то так: (ведь в справке нет ни примера, где было-бы указано, что надо использовать символы # [] ID: "" и т.д - это все должно во сне придти, с озарением!)

ControlClick("[CLASS:#32770]", "", "[CLASSNN:SysTreeView321; ID:1439]", "", "", "31", "201")
ControlClick(WinGetTitle("[Class:#32770]"), "", "SysTreeView321", "left", 1, 31, 201)
If above does not work try
ControlClick("", "", "SysTreeView321", "left", 1, 31, 201)
ControlClick("[CLASS:#32770]", "", "[CLASSNN:SysTreeView321; ID:1439]", "left", 1, 31, 201)

Я не поленился, я пробовал экспериментировать переделывая свой код по примеру этих, но у меня ни черта не вышло.
Тут ВАЖНО понимать, что я критикую справку, а не труды переводчика, который за спасибо все это переводил.


P.S. К чему вся эта бомбежка? Да к тому, что нужно что-то менять. Пусть толковые, соображающие ребята, дополнят справку полезными примерами, пусть переводчик возьмется за дело и переведет свежую справку по ahk, которая уже множество раз пополнилась новыми функциями.
Понятное дело, что "за спасибо" работать мало кому хочется, но форум посещают множество людей, давайте сделаем кошелек для пожертвований на это дело и простимулируем людей на работу. Я буду одним из первых, кто ради этого будет закидывать денежку, если угодно даже со скринами платежей.

9

Re: AHK: Сравнение значений строки состояния программы и операции с ними

AutoIt и AutoHotkey разные языки. На сколько мне известно. Те примеры какраз из первого.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

10

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Ап теме что-ли. Ни кто не может подсказать, как правильно использовать

ClassNN 

?

11 (изменено: Malcev, 2015-04-13 14:28:52)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

У меня уже давно бомбит от "полезности" справки, в ней частенько приведена в пример (простите за мой французский) байда общего характера, без конкретных, полезных применений.

Справка отличная, правда слегка устаревшая.
А вот навигация хромает, да и дизайн неудачный.
Но переделывать ее вряд ли кто захочет.

ControlClick, ToolbarWindow322 10, ahk_exe uTorrent.exe
ControlClick, ToolbarWindow322:10, ahk_exe uTorrent.exe
ControlClick, ToolbarWindow322-10, ahk_exe uTorrent.exe
ControlClick, ClassNN: ToolbarWindow322; id: 10, ahk_exe uTorrent.exe
ControlClick, ToolbarWindow322id10, ahk_exe uTorrent.exe
ControlClick, ToolbarWindow322 id10, ahk_exe uTorrent.exe

А где вы там такие контролы нашли?
Вот так можно увидеть список контролов активного окна:

f10::
WinGet, controls, ControlList, A
Msgbox % controls
Return

12

Re: AHK: Сравнение значений строки состояния программы и операции с ними

elektrovenik пишет:

давайте сделаем кошелек для пожертвований на это дело и простимулируем людей на работу.

Думаю, вы плохо представляете, сколько реально может стоить такая работа. Нормальная оплата квалифицированного специалиста — по крайней мере €10 в час. Так что это делалось только на чистом энтузиазме, когда AHK только недавно появилась. А сейчас, понятно, он слегка поутих.

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

13

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Malcev пишет:

А где вы там такие контролы нашли?
Вот так можно увидеть список контролов активного окна:

f10::
WinGet, controls, ControlList, A
Msgbox % controls
Return

Контролы нашел программой AhkSpy (спасибо serzh82saratov за отличную программку). Скриншот прикладывал выше

+ открыть спойлер

http://i6.5cm.ru/c/U4Mt.jpg

Ваш код я попробовал, вот только что же он мне дает? Список контролов, в котором в одну из строчек надо ткнуть пальцем на удачу?
Указанная выше программа тем и удобна, что можно подвести курсор мыши к конкретному элементу и получить о нем данные.
Как видно на скрине, ClassNN контрола кнопки остановки закачки ToolbarWindow322, Id контрола 10. Я прошу людей, знающих правильный синтаксис, помочь написать мне строчку кода, выполняющую клик по этому контролу.

14

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Id контрола 10

Это Id объекта в acc.
http://www.autohotkey.com/board/topic/7 … -09272012/
В твоем случае легче сделать так:

f10::
Send {AppsKey}{down 10}{enter}

15

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Если кнопка относительно контрола всегда в одном месте,  то проще controlclick использовать.  Клик относительно координат контрола подробно описан в русиш хелпе.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16 (изменено: elektrovenik, 2015-04-13 16:49:59)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Увы, но так не проще. Поясню, почему я хочу уйти от

ControlClick, x390 y60, ahk_exe uTorrent.exe ; клик по клавише остановки закачки

- есть желание свернуть окно торрента) Иначе бы так и оставил клик по координатам в окне.
Я пытаюсь понять вот что: то, что я решил взяться за использование ClassNN как-то ужасно? Но другого выхода я не вижу. К сожалению, даже через PostMessage осуществить не получается, т.к. у торрента нет WM_COMMAND для остановки и запуска закачки (есть для паузы всех закачек и возобновления через трей, но это не годится).
Я уверен, что решить задачу с использованием ClassNN реально, т.к. я уже писал выше, при использовании такого кода

ControlClick, ToolbarWindow322, ahk_exe uTorrent.exe

происходит клик по кнопке, которая располагается рядом, с нужной мне:

+ открыть спойлер

Зеленым цветом выделил ту кнопку, нажатия которой требуется добиться, а красным ту, которая нажимается.http://i6.5cm.ru/i/S8jK.jpg

Из этого я делаю вывод, что в моем коде не хватает указания ID контрола (об это собственно и справка гласит):

Режим 2 (ClassNN или Текст): укажите необходимый ClassNN (имя класса и номер элемента управления)

Имя класса у нас ToolbarWindow322, остается номер и как его правильно записать в код, т.к. справка не содержит примера.

17

Re: AHK: Сравнение значений строки состояния программы и операции с ними

http://forum.script-coding.com/viewtopic.php?id=7115

18 (изменено: elektrovenik, 2015-04-13 18:36:47)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Спасибо за идею, Malcev. Пришлось немного поковыряться:
В таком варианте работать никак не хотел, не нравятся ему координаты точки в окне:

F5::
PostMessage, 0x201, 1, ((60<<16)^390), , ahk_exe uTorrent.exe
PostMessage, 0x202, 0, ((60<<16)^390), , ahk_exe uTorrent.exe
sleep 2500
PostMessage, 0x201, 1, ((60<<16)^355), , ahk_exe uTorrent.exe
PostMessage, 0x202, 0, ((60<<16)^355), , ahk_exe uTorrent.exe
return

Поэтому решил попробовать с координатами контрола:

F5::
PostMessage, 0x201, 1, ((10<<16)^195), ToolbarWindow322, ahk_exe uTorrent.exe
PostMessage, 0x202, 0, ((10<<16)^195), ToolbarWindow322, ahk_exe uTorrent.exe
sleep 2500
PostMessage, 0x201, 1, ((15<<16)^163), ToolbarWindow322, ahk_exe uTorrent.exe
PostMessage, 0x202, 0, ((15<<16)^163), ToolbarWindow322, ahk_exe uTorrent.exe
return

И наконец желаемое достигнуто!!!

19

Re: AHK: Сравнение значений строки состояния программы и операции с ними

WinExist("ahk_class µTorrent4823DF041B09")
WinRestore
ControlGet, hwnd, hwnd,, ToolbarWindow322
WinGetPos, x, y,,, ahk_id %hwnd%

AccObj := AccObjectFromPoint("", x + 1, y + 1)
PressToolBarButton(AccObj, "Остановить торрент")

PressToolBarButton(AccObj, ButtonName)
{
   Loop % AccObj.accChildCount()
      if (AccObj.accName(A_Index) = ButtonName)
         Return AccObj.accDoDefaultAction(A_Index)
   MsgBox, Кнопка %ButtonName% не найдена!
}

AccObjectFromPoint(ByRef _idChild_, x, y)
{
   static h
   !h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")
   If   DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x&0xFFFFFFFF|y<<32, "Ptr*", pacc
      , "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
      Return   ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20 (изменено: elektrovenik, 2015-04-13 19:42:42)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

teadrinker, проверил Ваш код - работает, но что-то даже пугает мысль о том, чтобы попытаться его понять.

21

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Дорогу осилит идущий! Если что-то конкретное хотите узнать, спрашивайте.

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

22

Re: AHK: Сравнение значений строки состояния программы и операции с ними

А вот так сработает, даже если окно свёрнуто или скрыто:

DetectHiddenWindows, On
WinExist("ahk_class µTorrent4823DF041B09")
ControlGet, hwnd, hwnd,, ToolbarWindow322

PressToolBarButton(hwnd, 10)

PressToolBarButton(hwnd, ButtonID)
{
   AccObj := AccObjectFromWindow(hwnd, OBJID_CLIENT := 0xFFFFFFFC)
   if !IsObject(AccObj)  {
      MsgBox, Не удалось получить AccObj
      Return
   }
   AccObj.accDoDefaultAction(ButtonID)
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static h
   !h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
      , "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
      ,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
   Return   ComObjEnwrap(9,pacc,1)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Разве так не работает в свсёрнутом окне?

    WinExist("ahk_exe uTorrent.exe")
    ControlGetPos, X, Y,,, ToolbarWindow322 
    ControlClick, % "x" X+199 " y" Y+12,,,,, Pos
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Не знаю, не проверял. Так мы к координатам привязаны, а они зависят от вида окна. У меня совсем другие, например. И в скрытом виде не сработает.

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

25

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Нет, не работает. И не должно, вроде.

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

26

Re: AHK: Сравнение значений строки состояния программы и операции с ними

А у меня работает в торренте, и ещё в одной.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

27

Re: AHK: Сравнение значений строки состояния программы и операции с ними

У меня вот так выдаёт пустое значение, если окно свёрнуто:

WinExist("ahk_exe uTorrent.exe")
ControlGetPos, X, Y,,, ToolbarWindow322
MsgBox, % X
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28

Re: AHK: Сравнение значений строки состояния программы и операции с ними

У меня в свёрнутом виде

WinExist("ahk_exe uTorrent.exe")

неправильно определяет хэндл. А вот так в свёрнутом виде работает:

WinExist("ahk_class µTorrent4823DF041B09")

Но не в скрытом, в отличие от варианта с Accessible.

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

29 (изменено: elektrovenik, 2015-04-13 21:42:52)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

teadrinker пишет:

А вот так сработает, даже если окно свёрнуто или скрыто:

+ открыть спойлер
DetectHiddenWindows, On
WinExist("ahk_class µTorrent4823DF041B09")
ControlGet, hwnd, hwnd,, ToolbarWindow322

PressToolBarButton(hwnd, 10)

PressToolBarButton(hwnd, ButtonID)
{
   AccObj := AccObjectFromWindow(hwnd, OBJID_CLIENT := 0xFFFFFFFC)
   if !IsObject(AccObj)  {
      MsgBox, Не удалось получить AccObj
      Return
   }
   AccObj.accDoDefaultAction(ButtonID)
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static h
   !h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
      , "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
      ,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
   Return   ComObjEnwrap(9,pacc,1)
}

Подтверждаю, работает даже тогда, когда окно свернуто в трей. По сути это здорово (что у Вас получилось реализовать), но в данной ситуации бесполезно, т.к. если окно свернуто в трей, то основной код скрипта не работает (ему не удается получить данные из строки состояния):

+ открыть спойлер
Torrent := "AHK_exe utorrent.exe"
while WinExist(Torrent) {
   sleep 30000
   StatusBarGetText, DL, 4, %Torrent%
   Arr:= StrSplit(DL, " ")
   if (Arr[2]<300)&&(Arr[3]<>"МБ/с")
      Gosub Restart
}
return

Как вариант, может Вам и serzh82saratov объединить усилия, чтобы наваять мощную штуку, которая полностью функциональна, даже при скрытом окне торрента?)

30

Re: AHK: Сравнение значений строки состояния программы и операции с ними

elektrovenik пишет:

ему не удается получить данные из строки состояния

Да? А мне удалось:

DetectHiddenWindows, On
While WinExist("ahk_class µTorrent4823DF041B09")  {
   StatusBarGetText, Var, 4
   Sleep, 1000
   TrayTip,, % Var
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: AHK: Сравнение значений строки состояния программы и операции с ними

teadrinker пишет:

А вот так сработает, даже если окно свёрнуто или скрыто:

+ открыть спойлер
DetectHiddenWindows, On
WinExist("ahk_class µTorrent4823DF041B09")
ControlGet, hwnd, hwnd,, ToolbarWindow322

PressToolBarButton(hwnd, 10)

PressToolBarButton(hwnd, ButtonID)
{
   AccObj := AccObjectFromWindow(hwnd, OBJID_CLIENT := 0xFFFFFFFC)
   if !IsObject(AccObj)  {
      MsgBox, Не удалось получить AccObj
      Return
   }
   AccObj.accDoDefaultAction(ButtonID)
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static h
   !h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
      , "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
      ,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
   Return   ComObjEnwrap(9,pacc,1)
}

Написать аналогичный код, для кнопки "запустить торрент" можете? Я не возьмусь править Ваш, т.к. не уверен, что все прокатит, если изменить только PressToolBarButton(hwnd, 10) на PressToolBarButton(hwnd, 9)

32

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Всё верно, с девяткой должно сработать, если это предыдущая кнопка.

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

33 (изменено: elektrovenik, 2015-04-14 00:12:50)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Не выходит сделать в скрипте сразу 2 действия, просто изменив PressToolBarButton(hwnd, 10) на PressToolBarButton(hwnd, 9), т.к. появляются дубликаты функций. Попробовал разгрести дубликаты, путем изменения имен функций для каждой из кнопок, в итоге запутался в коде и теперь появляется MsgBox с с сообщением, что не удается получить AccObj

34 (изменено: Malcev, 2015-04-14 00:12:25)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

У меня так создает новый торрент в любом состоянии окна Юторрента:

detecthiddenwindows, on
controlGet, topHandle, HWND,, ToolbarWindow322, ahk_class µTorrent4823DF041B09
ControlClick, x33 y29, ahk_id %topHandle%,,,,NA Pos

teadrinker, А можешь объяснить, как ты заставил кликать в свернутое окно через AccObject?

35

Re: AHK: Сравнение значений строки состояния программы и операции с ними

DetectHiddenWindows, On
if !WinExist("ahk_class µTorrent4823DF041B09")  {
   MsgBox, Окно µTorrent не найдено
   ExitApp
}
ControlGet, hToolbar, hwnd,, ToolbarWindow322

while WinExist()  {
   sleep 30000
   StatusBarGetText, DL, 4
   Arr:= StrSplit(DL, " ")
   if !(Arr[2]<100)&&(Arr[3]<>"МБ/с")
      continue
   
   PressToolBarButton(hToolbar, 10)  ; 10 — StopTorrent
   Sleep, 2500
   PressToolBarButton(hToolbar, 9)   ; 9 — StartTorrent
}
return

F5::Pause

PressToolBarButton(hwnd, ButtonID)
{
   AccObj := AccObjectFromWindow(hwnd, OBJID_CLIENT := 0xFFFFFFFC)
   AccObj.accDoDefaultAction(ButtonID)
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static h
   !h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
      , "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
      ,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
   Return   ComObjEnwrap(9,pacc,1)
}
Malcev пишет:

как ты заставил кликать в свернутое окно через AccObject?

Получаем AccObj панели инструментов (клиентской части окна — OBJID_CLIENT := 0xFFFFFFFC), idChild (в коде ButtonID)  — это порядковый индекс её дочернего элемента, выполняем для него команду DoDefaultAction, а это для него действие "нажать".

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

36 (изменено: Malcev, 2015-04-14 00:27:46)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Ну мой вариант в 3 строчки попроще будет

Получаем AccObj панели инструментов (клиентской части окна — OBJID_CLIENT := 0xFFFFFFFC

А через что его получить?
Не хочешь при свободном времени сделать факи с примерами и объяснениями по поводу нахождения нужных объектов, текста и прочего через Acc?
А то, что здесь, что на оф. форуме информации мало и она малопонятна.
А штука иногда бывает очень нужная.

37

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Malcev пишет:

Ну мой вариант в 3 строчки попроще будет

У меня тоже работает. Один минус — привязка к координатам, возможно, они в общем случае могут быть разными, хотя точно не знаю.

А через что его получить?

Не понял вопроса. В коде, вроде, всё написано.

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

38

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Я имею в виду:

OBJID_CLIENT := 0xFFFFFFFC

Откуда эти данные? Какой утилитой взять?
AccViewer Source - не показывает.

39

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Это виндосовская константа, они берутся по названию из списка констант.

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

40

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Не хочешь при свободном времени сделать факи с примерами и объяснениями по поводу нахождения нужных объектов, текста и прочего через Acc?

Тут проблема в том, что в каждом случае по-разному всё ищется. Не существует какой-то общей Acc-структуры, каждый объект по-своему устроен, каждый раз нужно исследовать с помощью AccViewer'а.

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

41

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Но есть же какой-то алгоритм поиска?

42

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Нет, для каждого случая свой алгоритм, так что предпочитаю конкретные вопросы.

Malcev пишет:

Откуда эти данные?

Например, вот.

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

43

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Конкретный вопрос. Как нажать на кнопку если контрол в котором она находится периодически меняет название?
Если в IE нажать F12, потом выбрать Network, то как нажать на Enable network traffic capturing?
Пока набросал такой код, основываясь на том, что контрол стоящий после контрола с кнопками постоянен.
А если бы не был постоянен, то что тогда?

f6::
DetectHiddenWindows, On
WinGet, controls, ControlList, ahk_class IEFrame
RegexMatch(controls, "(ATL:[^:]+?)`nStatic1", match)
msgbox % match1
ControlGet, hwnd, hwnd,, %match1%, ahk_class IEFrame
PressToolBarButton(hwnd, 2)

PressToolBarButton(hwnd, ButtonID)
{
   AccObj := AccObjectFromWindow(hwnd, OBJID_CLIENT := 0xFFFFFFFC)
   if !IsObject(AccObj)  {
      MsgBox, Не удалось получить AccObj
      Return
   }
   AccObj.accDoDefaultAction(ButtonID)
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static h
   !h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
      , "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
      ,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
   Return   ComObjEnwrap(9,pacc,1)
}

44

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Malcev пишет:

Как нажать на кнопку если контрол в котором она находится периодически меняет название?

Можно учитывать оба названия, можно ориентироваться на ту часть названия, которая остаётся постоянной, но лучше всего привязываться к idChild, как в примере с µTorrent выше.

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

45

Re: AHK: Сравнение значений строки состояния программы и операции с ними

А как мы его привяжем, если не знаем названия контрола?

46

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Ну мы же видим этот контрол, можем протестировать с помощью AccViewer, определить idChild, варианты названия. По-другому никак.

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

47

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Так я имею в виду, как автоматизировать этот процесс?
В AccViewer я даже пути не нашел к нажатию этой кнопки через окно эксплорера, только через название данного контрола, которое при перезагрузки IE меняется. idChild - у кнопки постоянен.

48

Re: AHK: Сравнение значений строки состояния программы и операции с ними

А зачем его автоматизировать-то? Не пойму, чего именно ты хочешь добиться.

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

49

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Я хочу, чтобы при нажатии f6 нажималась кнопка записи траффика сети.
Что успешно делает код из поста 43.
Но там я делаю через пень-колоду.
Получаю список всех контролов, нахожу через регексы нужный мне и через него посылаю клик на эту кнопку.
Так вот вопрос - как можно послать клик на эту кнопку без нахождения контрола?

50

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Так а чем перебор контролов плох? Мы знаем, что его ClassNN начинается на "ATL:" и заканчивается на единицу. На основе этих данных можно определить его однозначно. Да и какая разница — перебор контролов, или переребор элементов acc-структуры?

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

51

Re: AHK: Сравнение значений строки состояния программы и операции с ними

А если бы не знали? Может можешь написать как это сделать с перебором элементов acc-структуры без упоминания контрола? Необязательно этот конкретный случай, а просто шаблон. Я изучал пример на офсайте с блокнотом, но там упоминается контрол и еще приплетен Acc_Parent. Непонятно зачем?

if    !window :=    Acc_Parent(Acc_ObjectFromWindow(WinExist("ahk_class Notepad")))
{
    MsgBox, Epic FAIL d00d.
    return
}
For each, object in Acc_Children(window)
{}    Until    (object.accName="Application")
Sleep, 100
For each, mainMenu in Acc_Children(object)
{}    Until    (mainMenu.accName="File")
WinGet, b, List, ahk_class #32768
mainMenu.accDoDefaultAction(1), a :=    b
Sleep, 50
While    (a=b)
    WinGet, a, List, ahk_class #32768
fileMenu :=    Acc_ObjectFromWindow(a%a%)
For each, item in Acc_Children(fileMenu)
{}    Until    InStr(fileMenu.accName(item),"Open")
fileMenu.accDoDefaultAction(item)

52

Re: AHK: Сравнение значений строки состояния программы и операции с ними

У меня этот код не работает. А у тебя?
На каком примере показывать-то, и что искать?

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

53

Re: AHK: Сравнение значений строки состояния программы и операции с ними

У меня тоже не работает.
Как повторить этот код, без  вписывания контрола?

Если в IE нажать F12, потом выбрать Network, то как нажать на Enable network traffic capturing?

f6::
DetectHiddenWindows, On
WinGet, controls, ControlList, ahk_class IEFrame
RegexMatch(controls, "(ATL:[^:]+?)`nStatic1", match)
msgbox % match1
ControlGet, hwnd, hwnd,, %match1%, ahk_class IEFrame
PressToolBarButton(hwnd, 2)

PressToolBarButton(hwnd, ButtonID)
{
   AccObj := AccObjectFromWindow(hwnd, OBJID_CLIENT := 0xFFFFFFFC)
   if !IsObject(AccObj)  {
      MsgBox, Не удалось получить AccObj
      Return
   }
   AccObj.accDoDefaultAction(ButtonID)
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static h
   !h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
      , "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
      ,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
   Return   ComObjEnwrap(9,pacc,1)
}

54

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Никак, похоже. У этого контрола, скорее всего, своя отдельная acc-структура, она не является веткой структуры окна IE.

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

55

Re: AHK: Сравнение значений строки состояния программы и операции с ними

А как нажать кнопку у Юторрента, не определяя ее контрол в этом коде?

DetectHiddenWindows, On
WinExist("ahk_class µTorrent4823DF041B09")
ControlGet, hwnd, hwnd,, ToolbarWindow322

PressToolBarButton(hwnd, 10)

PressToolBarButton(hwnd, ButtonID)
{
   AccObj := AccObjectFromWindow(hwnd, OBJID_CLIENT := 0xFFFFFFFC)
   if !IsObject(AccObj)  {
      MsgBox, Не удалось получить AccObj
      Return
   }
   AccObj.accDoDefaultAction(ButtonID)
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static h
   !h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
      , "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
      ,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
   Return   ComObjEnwrap(9,pacc,1)
}

56

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Та же ситуация. AccViewer находит панель инструментов, если идти от общего окна, но в этом случае кнопки не имеют свойства DefaultAction.

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

57 (изменено: Malcev, 2015-04-15 20:58:00)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

1) А без DefaultAction нажать нельзя?
2) Как в Юторренте нажать на кнопку находящуюся по адресу 4,2,4,8,4,7,4 (у нее роль прописана) без определения контрола?

58

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Нажать — это и есть DefaultAction.
У меня такого пути нет. Тоже должна быть DefaultAction прописана.

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

59

Re: AHK: Сравнение значений строки состояния программы и операции с ними

То есть, если Роль не прописана, значит нажать получится только отправив клик по координатам? Да?
Вот я про эту кнопку.
http://savepic.net/6743800.jpg

60

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Ещё раз — прописана должна быть DefaultAction (в окне AccViewer просто Action).
А у меня такой кнопки нету. Версия μTorrent 3.4.3  (build 39944).

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

61

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Вообще в твоём случае должно вот так сработать, если я твой ahk_class указал правильно:

MsgBox, % Acc_Get("DoDefaultAction", "4.2.4.8.4.7.4", 0, "ahk_class µTorrent4823DF041B09")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

62

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Значение пустое возвращает, но нажимает.
А как послать на нее нажатие без точного адреса, а с помощью перебора ChildId?
Если для этого нужно ее ACC.name, то назовем ее buttonUp.

63

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Нет, давай на каком-нибудь реальном примере. Например, клик по ссылке на странице в IE, или что-то, что у всех есть.

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

64

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Нажатие на кнопку "1" в калькуляторе.

65

Re: AHK: Сравнение значений строки состояния программы и операции с ними

В тких случаях проще:

ControlClick, Button7, ahk_class CalcFrame ahk_exe calc.exe

Всё равно получать Асс из хэндла стандартного контрола.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

66

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Вот мне хотелось бы узнать как можно нажать на кнопку 1 в калькуляторе без получения хендла контрола, а только методом перебора Acc.accName(child).

67 (изменено: teadrinker, 2015-04-16 12:23:23)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

SetBatchLines, -1
AccCalc := Acc_ObjectFromWindow(WinExist("ahk_class CalcFrame"))
AccElem := SearchElement(AccCalc, ROLE_SYSTEM_PUSHBUTTON := 0x2B, "1")
AccElem.accDoDefaultAction(0)

SearchElement(ParentElement, Role, Name = "", Value = "")
{
   if (ParentElement.accRole(0) = Role && (Name = "" || ParentElement.accName(0) = Name)
                                       && (Value = "" || ParentElement.accValue(0) = Value))
      Return ParentElement
   
   for k, v in Acc_Children(ParentElement)
      if obj := SearchElement(v, Role, Name, Value)
         Return obj
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

68

Re: AHK: Сравнение значений строки состояния программы и операции с ними

А лучше даже так:

SetBatchLines, -1
AccCalc := Acc_ObjectFromWindow(WinExist("ahk_class CalcFrame"))
; параметры, начиная со второго: Role, Name, Value
AccElem := SearchElement(AccCalc, ROLE_SYSTEM_PUSHBUTTON := 0x2B, "1", "")
AccElem.accDoDefaultAction(0)

SearchElement(ParentElement, params*)
{
   found := 1
   for k, v in params  {
      (k = 1 && ParentElement.accRole(0) != v && found := "")
      (k = 2 && ParentElement.accName(0) != v && found := "")
      (k = 3 && ParentElement.accValue(0) != v && found := "")
   }
   if found
      Return ParentElement
   
   for k, v in Acc_Children(ParentElement)
      if obj := SearchElement(v, params*)
         Return obj
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

69

Re: AHK: Сравнение значений строки состояния программы и операции с ними

А если мы не знаем Имя Окна к которому принадлежит данный элемент с тким именем, то придется в цикле перебирать все возможные контролы и в них уже искать эту кнопку? Это я про пример из 55 поста.

А как нажать кнопку у Юторрента, не определяя ее контрол в этом коде?

70

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Наверное. А почему мы можем не знать имя окна? Подобный код пишется под конкретный объект.

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

71 (изменено: Malcev, 2015-04-18 15:17:41)

Re: AHK: Сравнение значений строки состояния программы и операции с ними

Например, в IE имя контрола в панели раработчика где находится кнопки "Начать запись сети' постоянно меняется. Там я его смог вычеслить. Но ведь наверняка существуют программы, которые постоянно, после каких-то действий меняют названия контролов, а названия acc объектов остаются те же.
Может стоит вынести все эти примеры и ранее опубликованные в отдельный  топик по ACC?