1

Тема: AHK: определение завершения набора текста командой SendInput

Доброго времени суток!
Столкнулся с одной проблемой, которую никак не могу решить (в AHK новичок) - требуется помощь мастеров AHK.
В общем, требуется регулярная вставка текста, который содержится в буфере обмена. Причем не простая вставка, а именно имитация набора (для чего использую команду SendInput).
Текст может состоять из русских и английских символов различной длины.
Программа, в которую вставляется текст из буфера обмена, корректно распознает вставляемые символы только если раскладка окна переключена на английский язык. При этом 99% времени приходится работать в программе на русской раскладке. В связи с этим переключать окно на английский перед вставкой, а потом обратно, "руками" неудобно.
Для решения проблемы использую следующий код:

Home::
SendMessage, 0x50,, 0x4090409,, A ; перед вставкой переключаю активное окно на английский
cpbd = %clipboard%
TimeSleep := (StrLen(cpbd) * 3) ; "костыль" для расчета времени Sleep в зависимости от числа символов в буфере
if TimeSleep <= 50
{
	SendInput {Raw}%clipboard%
	Sleep, 50
} 
else 
{
	SendInput {Raw}%clipboard%
	Sleep, %TimeSleep%
}
SendMessage, 0x50,, 0x4190419,, A ; возвращаю активному окну русский язык
return

И всё было бы хорошо, если бы не один серьёзный минус: перед отработкой команды, которая возвращает окну русский язык, используется "костыль" в виде команды Sleep.
Дело в том, что если в программе работать из локальной сети, то всё ОК, но в последнее время всё чаще приходится работать удаленно - в результате прога регулярно подвисает. И как следствие этого, времени в Sleep'е просто не хватает и на русский окно переключается раньше времени, что приводит к некорректной вставке знаков и английских символов.
Увеличивать время в Sleep'е нерационально.

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

2

Re: AHK: определение завершения набора текста командой SendInput

А почему именно SendInput а не Send?
Тем более что Send больше похож на имитацию набора.

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

3

Re: AHK: определение завершения набора текста командой SendInput

serzh82saratov, вставка SendInput происходит заметно быстрее, поэтому использую его.
Замена SendInput на Send описанную проблему не исправляет.

4

Re: AHK: определение завершения набора текста командой SendInput

Не знаю, у меня в блокноте MsgBox появляется только после ввода.

1::
	Send {Raw}%clipboard%
	MsgBox 
	return

Пробуйте извлечь текст из окна и сравнивать с буфером.

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

5

Re: AHK: определение завершения набора текста командой SendInput

serzh82saratov
Хм, действительно, остальные команды ждут окончания выполнения простого Send'а.
Но при этом, если использовать:

SetKeyDelay, 0

то MsgBox также появляется раньше завершения набора...
P.S.: на самом деле использование Send/SendInput продиктовано только тем, что вставка в рабочее окно программы комбинацией Ctrl+V заблокирована на программном уровне - как обойти блокировку без имитации набора не знаю...

Также минусом Send является необходимость использования команды:

BlockInput, Send

В связи с этим вопрос: может ли так случиться, что после Send'а BlockInput не отключится? (Ведь тогда придется использовать кнопку reset на компе - а это весьма чревато...).

Пробуйте извлечь текст из окна и сравнивать с буфером.

Написать функцию, которая будет, допустим, каждые 50 мс сверять количество набранных знаков в окне с количеством знаков в буфере - идея весьма хорошая (как вариант "костыля"). Нужно только подумать теперь как ее реализовать...

6

Re: AHK: определение завершения набора текста командой SendInput

Mik пишет:

может ли так случиться, что после Send'а BlockInput не отключится?

Не знаю, не помню чтобы вообще пользовался.

Mik пишет:

(как вариант "костыля").

Я так делал, а как ещё убедится в правильности ввода. Если инфо извлекается, то это самое надёжное.

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