1 (изменено: pontifex91, 2018-04-01 15:44:17)

Тема: AHK: Проверка выполнения SendInput

Здравствуйте, господа. Нужно сделать проверку, был ли введен текст в окне, и в случае если текст найден, то разрешить дальнейшее выполнение скрипта.
Мой скрипт вводит текст через SendInput в поле программы, но ввиду особенностей этой программы, есть риск того, что текст введется не в поле ввода, а куда то в никуда, например во время подгрузки окна. Ahk_class окон программы имеют одинаковые названия, поэтому вариант с IfWinActive не подходит, и приходится идти на такие костыли.

То есть нужно что то типо этого:


SendInput, мой текст
if найден "мой текст"
{
	MsgBox OK
}
else 
MsgBox ERROR

2

Re: AHK: Проверка выполнения SendInput

Посмотрите сканером в какой контрол вы вводите.
ControlFocus, ControlSetText.

3

Re: AHK: Проверка выполнения SendInput

stealzy они не сканируются, во всех окнах одинаковый класс, я же написал. Поэтому необходим такой костыль

4

Re: AHK: Проверка выполнения SendInput

Вы, неправильно поняли предложенное.

Текст получает элемент окна, называемый "контрол". Найдите в окне тот, в который собираетесь ввести текст и опишите поведение ввода в сценарии, сообщая нужному окну фокус этого контрола используя "ControlFocus" и отправляя текст посредством "ControlSetText".

5 (изменено: pontifex91, 2018-04-01 20:33:22)

Re: AHK: Проверка выполнения SendInput

KusochekDobra
ок, я попробовал - это сработало в блокноте, как с ahk_class, так и с ahk_exe

ControlFocus, edit1
text := "My text test"
ControlSetText, edit1, %text%, ahk_class Notepad

и даже без указания ControlFocus и ClassNN

text := "My text test"
ControlSetText, , %text%, ahk_class Notepad

но это не работает в нужной программе

ни с ahk_class, ни с ahk_exe

ControlFocus, ApplicationFrameInputSinkWindow1
text := "My text test"
ControlSetText, ApplicationFrameInputSinkWindow1, %text%, ahk_class ApplicationFrameWindow

я может что-то упустил, конечно, но сканер показывает именно эти параметры
поэтому я пользуюсь этим вариантом:


IfWinActive, ahk_class ApplicationFrameWindow
  {
	SendInput MyText
  }
  else
  MsgBox Error

Но минус в том, что он может отправлять данные "в никуда", он не определяет когда это окно загружено полностью, и какое это окно конкретно.
И для того, чтобы мне ввести следующие данные, скрипту нужно сначала убедиться что первые данные были введены.

Таймер не подойдет, потому что юзер может нарушить последовательность, и следующие данные будут введены не туда, куда нужно.

6

Re: AHK: Проверка выполнения SendInput

Вам подсказали как действовать, Вы не поняли. Вам пояснили конкретней, Вы сделали опять как было и утверждаете, что не работает. Как Вам тогда помочь, если Вы об этой помощи просите, но советов не читаете, или читаете "по своему"?

Назовите программу, которой пользуетесь. Попробуйте так же в своём примере добавить задержку, например:


IfWinActive, ahk_class ApplicationFrameWindow
  {
	Sleep, 1000
	SendInput MyText
  }
  else
  MsgBox Error

Должно обязательно помочь. Если большая задержка критична, уменьшайте её значение до приемлемого.

7 (изменено: pontifex91, 2018-04-01 21:49:04)

Re: AHK: Проверка выполнения SendInput

KusochekDobra пишет:

Вам подсказали как действовать, Вы не поняли. Вам пояснили конкретней, Вы сделали опять как было и утверждаете, что не работает. Как Вам тогда помочь, если Вы об этой помощи просите, но советов не читаете, или читаете "по своему"?

Назовите программу, которой пользуетесь.

Да любое UWP приложение. Хоть сам Windows Store, например. Окно ввода данных аккаунта.
Что именно я не понял? ControlFocus - нашел. Отправку текста ControlSetText - сделал. Это работает с блокнотом и остальным софтом. С Windows Store и другими UWP - не работает.

KusochekDobra пишет:

Попробуйте так же в своём примере добавить задержку, например:

pontifex91 пишет:

Таймер не подойдет, потому что юзер может нарушить последовательность, и следующие данные будут введены не туда, куда нужно.

8

Re: AHK: Проверка выполнения SendInput

ControlFocus я предлагал чтобы определить что "окно загружено". Команда возвращает ErrorLevel.
С UWP не сталкивался, попробуйте тогда A_CaretX, когда каретка в поле ввода в этой переменной содержится ее координата. If A_CaretX {...}.

9

Re: AHK: Проверка выполнения SendInput

stealzy
Доброго времени. Спустя полтора года понадобилось снова решить проблему, наткнулся на эту тему, и по началу даже не признал что я автор, сидел, читал с интересом
Почему-то я вам не ответил тогда, поэтому хочу закрыть гештальт. Не в надежде на помощь, а ради завершенности темы, вдруг у кого-то будет похожая проблема.

- ControlFocus здесь не поможет, потому что загрузку самого окна то я могу определить, а когда его содержимое подгрузится - нет
- Переменная A_CaretX не помогла. Каретка отслеживается в блокноте, но не хочет этого делать в Google Сhrome и UWP приложениях
- Sleep я сделал в первую очередь, но это решение на авось, потому что скорость загрузки содержимого окна разное, а может и не загрузиться вовсе.

В итоге я остановился на таком костыле:
Отправляю в окно тестовое слово > Crtl+A > Копирую его в буфер обмена
Если слово появилось в буфере > Разрешаю выполнение скрипта
Если слово в буфере не появилось > Повторяю цикл