1

Тема: AHK: как повысить надежность ControlSend

Код AHK:


TruckID = AAA001
...
ControlFocus, WindowsForms10.EDIT.app.0.2004eee8, ahk_class WindowsForms10.Window.8.app.0.2004eee
ControlSend, WindowsForms10.EDIT.app.0.2004eee8, %TruckID%, ahk_class WindowsForms10.Window.8.app.0.2004eee

при посылке примерно в 15-20% случаев дает сбои в виде

aaa001,
AAA#01,
aAA001

Существует ли способ повысить надежность срабатывания команды?

Заранее благодарен

2

Re: AHK: как повысить надежность ControlSend

Может вам нужен ControlSetText

TruckID = AAA001
ControlSetText, WindowsForms10.EDIT.app.0.2004eee8, %TruckID%, , ahk_class WindowsForms10.Window.8.app.0.2004eee
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: как повысить надежность ControlSend

serzh82saratov пишет:

Может вам нужен ControlSetText

TruckID = AAA001
ControlSetText, WindowsForms10.EDIT.app.0.2004eee8, %TruckID%, , ahk_class WindowsForms10.Window.8.app.0.2004eee

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

Придется писать скрипт для проверки содержимого целевых ячеек после посылки текста.

4

Re: AHK: как повысить надежность ControlSend

не подходит - работает надежно

не подходит тем что надёжно работает?

программа сбоит - отказывается сохранять данные

Так вы код покажите, какая связь между посылом текста в контрол, и сохранением данных.

а при следующей загрузке прорисовывает контрол уже с текстом из прошлой сессии.

Вам контрол нужен в сторонней проге, или в своём GUI AHK?
И чего вы хотите вообще добится?

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

5

Re: AHK: как повысить надежность ControlSend

serzh82saratov пишет:

не подходит - работает надежно

не подходит тем что надёжно работает?

программа сбоит - отказывается сохранять данные

Так вы код покажите, какая связь между посылом текста в контрол, и сохранением данных.

а при следующей загрузке прорисовывает контрол уже с текстом из прошлой сессии.

Вам контрол нужен в сторонней проге, или в своём GUI AHK?
И чего вы хотите вообще добится?


Уважаемый serzh82saratov, не надо горячится. да и словесные перепалки нам ни к чему. Кода и информации в своем вопросе я привел ровно столько, сколько необходимо для описания  данной проблемы. Ваше предложение использовать ControlSetText вместо ненадежно работающей ControlSetText имеет смысл, ибо в моей ситуации ControlSetText показала лучшие результаты. Для себя я ее использовать увы, не  могу по причине побочных эффектов в целевом окне.

Если более детально, ситуация выглядит так:

Скрипт разрабатывается для управления диагностической программой для грузовых машин.
Вышеприведенный фрагмент кода посылает номер машины из переменной скрипта в соответствующее поле формы заказа на ремонт.

При тестовых прогонах скрипта выяснилось, что ControlSend работает со сбоями, описанными выше: в 11 из 71 формах номер авто был искажен. Причем применение Send вместо ControlSend  дало похожие результаты. Еще Send в данном случае дополнительно требовал клика мыши по контролу, что нежелательно.

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

Вот у меня и возник вопрос, есть ли возможность повысить надежность срабатывания ControlSend, ибо она мне в данной ситуации подходит лучше всего. Завтра поэкспериментирую с SetKeyDelay, в случае успеха - отпишусь. Однако, насколько я понимаю, на скорость посылки содержимого переменной SetKeyDelay не влияет, то есть успех маловероятен.

6

Re: AHK: как повысить надежность ControlSend

Однако, насколько я понимаю, на скорость посылки содержимого переменной SetKeyDelay не влияет, то есть успех маловероятен.

Как раз SetKeyDelay и будет вводить каждый символ переменной с заданным интервалом.

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

7 (изменено: serzh82saratov, 2013-02-12 02:00:17)

Re: AHK: как повысить надежность ControlSend

Хм. А ведь есть ещё и команда SetControlDelay, а я и не знал.

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

8

Re: AHK: как повысить надежность ControlSend

Видимо лучше использовать ControlSetText, просто ControlSend без SetKeyDelay печатает символы по одному с минимальной задержкой, а ControlSetText меняет содержимое контрола сразу, программа обрабатывает по одному символу и без паузы глючит. Проверьте это с помощью Ctrl+V ради интереса.

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

9 (изменено: serzh82saratov, 2013-02-12 13:17:14)

Re: AHK: как повысить надежность ControlSend

А на практике всё индивидуально:
В одной программе паузы выполняются, а в другой игнорируются

Хотя можно ввести по символам  

Var = красный зеленый синий

Loop, parse, Var
{
ControlSend, WindowsForms10.EDIT.app.0.2004eee8, %A_LoopField%, ahk_class WindowsForms10.Window.8.app.0.2004eee
Sleep 150
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: serzh82saratov, 2013-02-12 21:12:56)

Re: AHK: как повысить надежность ControlSend

Чтобы избежать ошибок после ввода, проверяйте с помощью ControlGetText.
Функция ControlSendText должна также учитывать регистр при проверке.
Вместо ControlSend используется ControlSendRaw


SetTitleMatchMode, 2
Text := "красный зеленый синий"

ControlSendText("WindowsForms10.EDIT.app.0.2004eee8", "ahk_class WindowsForms10.Window.8.app.0.2004eee", WinText, Text)
MsgBox %Text%
Return
;_____________________________ ControlSendText _____________________________ 

ControlSendText(Control, WinTitle, WinText, Text)
{
ControlFocus, %Control%, %WinTitle%, %WinText%
ControlSetText, %Control%, , %WinTitle%, %WinText%
Loop, parse, Text
{
Sleep 20
ControlSendRaw, %Control%, %A_LoopField%, %WinTitle%, %WinText%
}
ControlGetText, ControlText , %Control%, %WinTitle%, %WinText%
If (Text == ControlText)
Return
ControlSendText(Control, WinTitle, WinText, Text)
}

Если очистка контрола с помощью ControlSetText приведёт к сбою, нажимайте бэкспейс:

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

ControlSendText(Control, WinTitle, WinText, Text)
{
ControlFocus, %Control%, %WinTitle%, %WinText% 
Loop 
{
ControlGetText, ControlText , %Control%, %WinTitle%, %WinText%
If (A := StrLen(ControlText)) = 0
break
ControlSend, %Control%, {BackSpace %A%+3}, %WinTitle%, %WinText%
}
Loop, parse, Text
{
Sleep 20 
ControlSendRaw, %Control%, %A_LoopField%, %WinTitle%, %WinText%
}
ControlGetText, ControlText , %Control%, %WinTitle%, %WinText%
If (ControlText == Text)
Return
ControlSendText(Control, WinTitle, WinText, Text) 
}

Кстати у себя заметил, что без использования ControlFocus ошибки при вводе гораздо реже.

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