Что нового

[Автоматизация] Распознания/определения содержания буфера обмена и ввод данных не copy/past'ом

riever

Новичок
Сообщения
1
Репутация
0
Существует некая программа (скажем это будет ЭОД), на определенном этапе в ней необходимо вносить дату, даты у всех объектов разные, объектов много. существует отдельно вынесенная таблица с датами (сразу скажу, что перенести даты внутри программы нельзя). т.е. необходимо брать даты с таблицы (например excel) и вносить в соответствующие области в программе. НО! нельзя делать это с помощью copt/past, программа это не понимает. формат хх.хх.хххх, окно не реагирует на past, ни целой датой хх.хх.хххх ни отдельными частями хх / хх / хххх. работатет только непосредственный ввод, т.е. sendkey на языке autoit. так вот можно ли/ и как если можно перенести с помощью autoit даты с таблице в программу в автоматическом режиме, но не посредством copy/past. Существует ли способ распознавания символов содержащихся в буфере обмена и последующий их ввод как sendkey (переменное значение = символу из буфера)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
riever

Autoit может брать данные напрямую из файлов excel, сразу преобразуя данные из целых листов excel в массивы autoit.

Из буфера тоже несложно:
Код:
$sClip = ClipGet() ; получаем текст из буфера
Send($sClip) ; отправляем текст в активное окно


В любом случае, для автоматизации надо знать параметры окна программы, в которую вносятся данные. Если там элементы типа "Edit" или подобные, то между ними можно переключаться по порядку с помощью функции
Код:
ControlFocus
и заносить данные.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Я думаю:
Лучше вместо Send() - использовать ControlSend() ...
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Код:
#include <excel.au3>
#include <array.au3>


_MakeExcel()


$hNotepad = Run(@WindowsDir & "\Notepad.exe", "", @SW_MAXIMIZE)
WinActivate("[CLASS:Notepad]", "")
Sleep(100)

_Excel2EDI()
_Exit()

;Отправляем данные в АКТИВНОЕ приложение
Func _Send2EDI($sS = '')
	If $sS = '' Then Return
	$aA = StringSplit($sS, '')
	For $i = 1 To $aA[0]
		;Для лучшей работы нужно использовать ControlSend
		;ControlSend($sTitle, $sText, $hControl, $aA[$i])
		Send($aA[$i])
	Next
EndFunc

;Берем данные из Excel и постим в нужное окно
Func _Excel2EDI()
	;Перебираем со второй строки
	For $i = 2 To 20
		$sCellValue = _ExcelReadCell($oExcel, $i, 1)
		;Не знаю почему, но дата у меня странная
		$s1 = StringLeft( $sCellValue, 4 )
		$s2 = StringMid( $sCellValue, 5, 2 )
		$s3 = StringMid( $sCellValue, 7, 2 )
		$s = $s3 & '.' & $s2 & '.' & $s1
		_Send2EDI($s)
		;Для блокнота специально после каждого поля
		Send('{ENTER}')
	Next

EndFunc


;Создаем новую книгу. Заполняем датами
Func _MakeExcel()
	Global $oExcel = _ExcelBookNew()
	;Ненавижу лишние листы )
	$aSheets = _ExcelSheetList($oExcel)
	If $aSheets[0] > 2 Then
		For $i = $aSheets[0] to 2 Step -1
			_ExcelSheetDelete($oExcel, $aSheets[$i])
		Next
	EndIf
	;Переименовываем лист
	_ExcelSheetNameSet($oExcel, 'Dates')

	;Заполняем даты
	;Заголовок
	_ExcelWriteCell($oExcel, 'Даты для ЭОД', 1, 1)
	;Даты
	For $i = 2 To 20
		_ExcelWriteCell($oExcel, Random(1, 28, 1) & '.10.2011', $i, 1)
	Next
	$oExcel.ActiveCell.EntireColumn.AutoFit
EndFunc

Func _Exit()
	;Закрываем без сохранения
	_ExcelBookClose($oExcel, 0)
	MsgBox(0,0,'Выходим')
	Exit
EndFunc
 
Верх