Что нового

ctrl+a через controlsend (если "а" и insert имеют свои команды в окне)

zert88

Новичок
Сообщения
14
Репутация
0
Здравствуйте, имеется проблема с командой Controlsend. Я хочу выделить все в подокне виндового-окна и скопировать. Применяю команду вида controlsend('', '', '', '^a') , язык английский. Как я понял, проблема в окне, так как все буквы по отдельности сами, как команды, запускают поиск автоматом(сбивая выделение), а кнопка insert вызывает другое окно. Вот и получается нажимая ctrl+a сначала нажимается ctrl , потом нажимается "а", затем в таком же порядке отпускается, тем самым дополнительно вводится "а" и запускается поиск в окне. Как сделать так чтобы запустился первым ctrl, потом "а", затем отпустился "а" и только после ctrl. Пробовал использовать opt("SendKeyDelay") , opt("SendKeyDownDelay") и controlfocus, с различными значениями и по отдельности, проблема частично устраняется в самом лучшем варианте, но все равно возьмет, да проскочит отдельное "а" или insert.

Возможно, я слона не замечаю.

Думал также, на счет варианта отслеживать нажатие в подокне виндового-окна(но это походу не тривиальная задача, с 2мя exe) Видим, что в элемент было отправлено ctrl - первым exe (с удержанием нажатия к примеру в 400 мс), в этот момент , отправляем нажатие "а" с минимальными задержками на отжатие и посылаем отжатие ctrl ({CTRLUP} - если получится) или просто берем запас повремени больше чем 400 мс.
Или опять же использовать 2 exe, в первом запускаем второй exe(в котором с задержкой по времени стартует нажатие кнопки "а", взять к примеру 500мс ), далее в первом же нажимаем сразу же отправить в элемент ctrl с удержанием до 1 сек.

команда вида controlsend('', '', '', '{CTRLDOWN}a{Ctrlup}') не помогает

не прошло и 30 минут

догадался попробовать так controlsend('', '', '', '{CTRLDOWN}a{a up}{Ctrlup}')
посмотрим, как дальше будет вести себя, пока вроде работает
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Можно через _SendMessage
Код:
#include <SendMessage.au3>

$sTitle = "Безымянный — Блокнот" 		   ; Заголовок окна
$sControl = "Edit1"							; Имя элемента с текстом, смотрим в Autoit Window Info
$hEdit = ControlGetHandle($sTitle, "", $sControl)	; Получаем хэндл этого элемента
MsgBox(4096, "", _WM_GETTEXT($hEdit))

Func _WM_GETTEXT($h_Edit)                   ; Возвращает текст указанного элемента
    Local Const $WM_GETTEXT = 13, $WM_GETTEXTLENGTH = 14
	Local $iLength = _SendMessage($h_Edit, $WM_GETTEXTLENGTH, 0, 0)
    Local $aTemp = DllStructCreate("char[" & $iLength + 1 & "]")
    If @error Then Return SetError(1, 0, "Ошибка создания структуры")
    _SendMessageA($h_Edit, $WM_GETTEXT, $iLength + 1, DllStructGetPtr($aTemp))
    If @error Then Return SetError(2, 0, "_SendMessageA error")
    Return DllStructGetData($aTemp, 1)
EndFunc
 
Верх