Как минимум сделать правильно - убрать выпрыгивание по GOTO из цикла. Тем более, что оно здесь не нужно совсем.
Для этого удалить строки 18, 6, 1
А по поводу CTRL его нажатие проверяется только в месте выполнения ISKEYDOWN. Соответственно, если картинка найдена, то там пауз минимум на
300+300+50+50+50+10+поиск с % ≈ 1 сек.
9 и 7 строка тоже не нужны тут было пара товарищей любителей пихать после всех условий задержки, а люди потом за ними повторяют. Это вредные паразитные задержки непонятно с какой целью вставленные.
Если хочешь прям чёткого срабатывания после единичного короткого нажатия в любой момент, то нужно следить за клавишей в потоке.
THREAD(break_key_th, 0)
IF(ISKEYDOWN(#CTRL) = 1)
$break_key = 1
WHILE(ISKEYDOWN(#CTRL) = 1)
WAITMS(50)
END_CYC
SETTHREAD(break_key_th, 2)
ELSE
WAITMS(50)
END_IF
END_THREAD
SETTHREAD(break_key_th, 1)
$break_key = 0
WHILE($break_key= 0)
GETSCREEN(838,578,1706,1023)
IF_PICTURE_IN(838,578,1706,1023, "телмоб.bmp", -1, 80)
$WNDF = WNDFIND("Связь с телефоном")
WNDPOS($WNDF, 135, 190)
WAITMS(10)
WNDSIZE($WNDF, 1408, 844)
WAITMS(50)
LCLICK($_return1+12, $_return2+12)
WAITMS(300)
LCLICK(1425, 201) // Закрыть телефон
WAITMS(300)
ELSE
WAITMS(50)
END_IF
END_CYC
// Продолжение скрипта
после нажатия выход произойдёт не сразу, долбить не нужно. Просто выйдет из цикла когда закончит всеклики с паузами написанные в цикле - если картинка в тот момент найдена.