Что нового

Сделать окно активным и передать туда нажатие клавиши

Aoi

Новичок
Сообщения
13
Репутация
0
Задача - сделать окно активным, передать в него нажатие клавиши "r", затем выделить нужную область мышью и нажать клавишу "Enter".
Окно активным становится, но на нажатие клавиши не реагирует.
Клавиша "r" для данной утилиты должно вызвать возможность выделения области экрана (затемняет немного весь экран и скрывает Панель задач виндовс)
Также пытался через Send("{ASC 082}")
Еще пробовал Send ("r") - без фигурных скобок
Тоже не получилось



Код:
WinActivate("ABBYY Screenshot Reader", "")
Sleep ( 3000 )
Send ("{r}")
Sleep ( 1000 )
MouseClickDrag("left", 500, 500, 600, 600)
Sleep ( 1000 )
Send("{ENTER}")
 
Последнее редактирование:

All2khoff

Продвинутый
Сообщения
347
Репутация
65
попробуйте так.
Код:
WinActivate("ABBYY Screenshot Reader")
Sleep ( 3000 )
WinWaitActive("ABBYY Screenshot Reader")
Sleep (300)
 

lettterssino

Знающий
Сообщения
109
Репутация
10
Задача - сделать окно активным, передать в него нажатие клавиши "r", затем выделить нужную область мышью и нажать клавишу "Enter".
Окно активным становится, но на нажатие клавиши не реагирует.
Клавиша "r" для данной утилиты должно вызвать возможность выделения области экрана (затемняет немного весь экран и скрывает Панель задач виндовс)
Также пытался через Send("{ASC 082}")
Еще пробовал Send ("r") - без фигурных скобок
Тоже не получилось



Код:
WinActivate("ABBYY Screenshot Reader", "")
Sleep ( 3000 )
Send ("{r}")
Sleep ( 1000 )
MouseClickDrag("left", 500, 500, 600, 600)
Sleep ( 1000 )
Send("{ENTER}")
Я бы предположил, что у вас не реагирует на стадии нажатия клавиши "r"?
Возможно у вас при запуске скрипта меняется раскладка в системе. Или напишите подробнее на какой стадии и что происходит.
Возможно поможет https://autoit-script.ru/threads/kak-smenit-raskladku-klaviatury-ne-jazyk.14127/
 
Автор
A

Aoi

Новичок
Сообщения
13
Репутация
0
попробуйте так.
Код:
WinActivate("ABBYY Screenshot Reader")
Sleep ( 3000 )
WinWaitActive("ABBYY Screenshot Reader")
Sleep (300)
Не помогло
Сообщение автоматически объединено:

Я бы предположил, что у вас не реагирует на стадии нажатия клавиши "r"?
Возможно у вас при запуске скрипта меняется раскладка в системе. Или напишите подробнее на какой стадии и что происходит.
Возможно поможет https://autoit-script.ru/threads/kak-smenit-raskladku-klaviatury-ne-jazyk.14127/
Да, именно на нажатие "r" не работает. Проверил раскладку, она не причем. Т.к. горячая клавиша "r" если не из скрипта, а с клавиатуры, работает на любой раскладке.
При этом если открыть окно блокнота например, то клавиша "r", вводится нормально из этого скрипта.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Проверил раскладку, она не причем. Т.к. горячая клавиша "r" если не из скрипта, а с клавиатуры, работает на любой раскладке.
При этом если открыть окно блокнота например, то клавиша "r", вводится нормально из этого скрипта.
Это не является достаточным аргументом против высказанного предположения, так как существуют неописанные в справке особенности работы горячих клавиш в AutoIt в сочетании с различными раскладками. Повторяется ли ошибка, если вместо этой горячей клавиши использовать любую клавишу, не зависящую от раскладки? Например, можно попробовать для теста цифру.
 
Последнее редактирование:
Автор
A

Aoi

Новичок
Сообщения
13
Репутация
0
Это не является достаточным аргументом против высказанного предположения, так как существуют неописанные в справке особенности работы горячих клавиш в AutoIt в сочетании с различными раскладками. Повторяется ли ошибка, если вместо этой горячей клавиши использовать любую клавишу, не зависящую от раскладки? Например, можно попробовать для теста цифру.
Клавиша "r" зашита в утилите, которую я вызываю. Поменять на цифру не могу. Можно это как-то средствами AutoIt сделать?
Например отправляем 1, а в приложение передается "r" ?
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Клавиша "r" зашита в утилите, которую я вызываю. Поменять на цифру не могу. Можно это как-то средствами AutoIt сделать?
Например отправляем 1, а в приложение передается "r" ?
А разве так вообще горячие клавиши можно использовать? Есть вероятность, что скрипт напрямую опрашивает клавиатуру, а не реагирует на введение символов. Впрочем, возможно, что и нет, так как горячие клавиши выбраны из множества обычных комбинаций, а не в качестве множества клавиш. Или даже всё устроено ещё сложнее. Требуется знание, опыт или тест.

Для подтверждения или опровержения того, что проблема именно в отсутствии активности окна, существует техническая возможность для целей теста в период начальной паузы сделать окно активным вручную? Если да, то имеет смысл проделать такой тест.
 
  • Like
Реакции: Aoi
Автор
A

Aoi

Новичок
Сообщения
13
Репутация
0
А разве так вообще горячие клавиши можно использовать? Есть вероятность, что скрипт напрямую опрашивает клавиатуру, а не реагирует на введение символов. Впрочем, возможно, что и нет, так как горячие клавиши выбраны из множества обычных комбинаций, а не в качестве множества клавиш. Или даже всё устроено ещё сложнее. Требуется знание, опыт или тест.

Для подтверждения или опровержения того, что проблема именно в отсутствии активности окна, существует техническая возможность для целей теста в период начальной паузы сделать окно активным вручную? Если да, то имеет смысл проделать такой тест.
Проверил. Действительно, если мышкой нажать в окно утилиты и таким образом его сделать активным, то нажатие клавиши срабатывает потом.
Теперь надо понять, почему по WinActivate оно не становится полностью активным, хотя после выполнения WinActivate заголовок окна меняется с серого на яркий (активный). Что может быть?
 

Oki

Продвинутый
Сообщения
452
Репутация
62
хотя после выполнения WinActivate заголовок окна меняется с серого на яркий (активный).
При первом прочтении показалось, что есть индикация того, что окно так и не стало активным, а оно таки становится активным. Предыдущая реплика удалена.
 
Последнее редактирование:
Автор
A

Aoi

Новичок
Сообщения
13
Репутация
0
При первом прочтении показалось, что есть индикация того, что окно так и не стало активным, а оно таки становится активным. Предыдущая реплика удалена.
Уже успел попробовать через дескриптор окна, все равно не помогает

Код:
$handle = WinGetHandle("ABBYY Screenshot Reader", "")
WinActivate($handle, "")
Sleep ( 5000 )
Send ("{r}")

Сообщение автоматически объединено:

Может это поможет.
Вот окно стало активным по команде из скрипта. Заголовок окна яркий, окно активно, но нет фокуса на кнопке "скриншот"
Screenshot_1.jpg
Окно стало активным по нажатию мышкой вручную на заголовок окна. Заголовок окна яркий, окно активно, и фокус на кнопке "скриншот"
Screenshot_3.jpg
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
А макрокоманда @error не показывает, что невозможно сделать окно активным? В справке описывается такой вариант.
 
Автор
A

Aoi

Новичок
Сообщения
13
Репутация
0
А макрокоманда @error не показывает, что невозможно сделать окно активным? В справке описывается такой вариант.
Проверил, ошибку не выдает.
Вот думаю может надо как-то принудительно передать фокус внутри окна первому или любому другому элементу?
Не знаете как фокус сделать?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Там два окна с одинаковым заголовком
Код:
#include <WinAPISysWin.au3>
$aList = WinList("ABBYY Screenshot Reader")
For $i = 1 To $aList[0][0]
   ConsoleWrite($aList[$i][0] & " : " & $aList[$i][1] & @CRLF)
   $aPos = WinGetPos($aList[$i][1])
   ConsoleWrite($aPos[0] & ":" & $aPos[1] & ":" & $aPos[2] & ":" & $aPos[3] & @CRLF)
   ConsoleWrite(_WinAPI_GetClassName($aList[$i][1]) & @CRLF & "-----------" & @CRLF)
Next

Вам нужно вот это
Код:
WinActivate("[Title:ABBYY Screenshot Reader;Class:#32770]")
 
Автор
A

Aoi

Новичок
Сообщения
13
Репутация
0
Там два окна с одинаковым заголовком
Код:
#include <WinAPISysWin.au3>
$aList = WinList("ABBYY Screenshot Reader")
For $i = 1 To $aList[0][0]
   ConsoleWrite($aList[$i][0] & " : " & $aList[$i][1] & @CRLF)
   $aPos = WinGetPos($aList[$i][1])
   ConsoleWrite($aPos[0] & ":" & $aPos[1] & ":" & $aPos[2] & ":" & $aPos[3] & @CRLF)
   ConsoleWrite(_WinAPI_GetClassName($aList[$i][1]) & @CRLF & "-----------" & @CRLF)
Next

Вам нужно вот это
Код:
WinActivate("[Title:ABBYY Screenshot Reader;Class:#32770]")
Спасибо, получилось!
Я же правильно понимаю, код из спойлера не нужен? Это вы показали как узнать класс нужного окна.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
узнать класс нужного окна
С этим прекрасно справляется Au3Info. Другое дело, когда окна не отображаются или не имеют размеров или имеют одинаковые заголовки и классы. Пример поиска таких окон и получения по ним информации я и привёл. А нужен этот код или нет - решать вам.
 

lettterssino

Знающий
Сообщения
109
Репутация
10
С этим прекрасно справляется Au3Info. Другое дело, когда окна не отображаются или не имеют размеров или имеют одинаковые заголовки и классы. Пример поиска таких окон и получения по ним информации я и привёл. А нужен этот код или нет - решать вам.
Согласен, когда окно одно скрыто не очень хорошо, но я всегда проверяю сколько окон запускает приложение.
Код:
$aList = WinList('[CLASS:Notepad]')
MsgBox(64, 'Результат', 'Количество  окон "Notepad" = ' & $aList[0][0])

Вполне справляется данный кусок кода
 
Верх