Что нового

Потоковое копирование через буфер обмена

krapo

Новичок
Сообщения
3
Репутация
0
Версия AutoIt: 3.3.6.1

Описание:
Много приходится работать с Консультант+, из которого я получаю нужную текстовую информацию и копирую её в страницу WORD'а, делая подборку по решению того или иного вопроса.
Очень часто приходится собирать нужную информацию из совершенно разных баз Консультанта и из разных его документов. При этом приходится воспроизводить много раз одну и ту же последовательность действий:
1. Поиск в Консультанте нужной информации, выделение её и копирование в буфер обмена
2. Открытие WORD и создание пустой страницы
4. Вставка из буфера обмена ранее найденной информации
5. Далее перевод строки один или два раза (для того, чтобы следующая найденная информация была отделена от предыдущей)
( Ввод следующего найденного блока информации из буфера обмена вставляется естественно в конце, там, где стоит курсор. )

При этом также обычно перед тем, как вставить в страницу WORD'а информации из буфера обмена, приходится обычно вначале оформлять и ставить короткую текстовую метку с описанием ссылки на документ, где информация найдена.

И вот что-то мне кажется, что эту работу можно попробовать автоматизировать и решить задачу последовательной вставки в страницу WORD'а найденной информации через AutoIt скрипт. Но мне пока не по плечу такая масштабная задача.
Прошу помощи!
Для начала скажите, можно ли средствами AutoIt решить эту задачу???


Примечания:
В самом Консультанте в принципе встроен уже инструмент прямого копирования в WORD. Но...
1. На разных версиях WINDOWS и Office эта встроенная утилита часто сбоит. Так, например при первоначальном создании чистого нового документа WORD по команде из Консультанта WORD 2007, 2010 могут зависать, и система начинает ругаться на то, что копируемый блок уже отправлен, но программа-приёмщик (WORD) не найдена. Приходится решать эту задачу тем, что вначале приходится вручную запускать Консультант+ и WORD, и затем уже заносить информацию.
2. Сама последовательность действий при этом всё равно не автоматизирована, т.к. приходится постоянно переключаться между окнами Консультанта и WORD'а и дежурно жать одни и те же контекстные команды мышки, как копировать и вставить.


Постановка задачи:
Нельзя ли этот процесс автоматизировать??? таким образом, что как только очередной блок текстовой информации появляется в буфере обмена, то...
1. Появляется окно для ввода текстовой метки найденного блока и его краткого описания.
2. По нажатию кнопки "ввод" в окне меток сама метка автоматом копируется в WORD и делает одинарный перевод строки.
3. Далее уже сам ранее скопированный в буфер обмена блок информации автоматически вставляется в конце открытого документа WORD
4. Далее скрипт самостоятельно делает дважды перевод строки и ждёт появления следующего блока информации в буфере обмена по тому же принципу ввода.

То есть само копирование информации из буфера обмена должно происходить "в тени" без переключения в окно WORD,а.
Сама работа пользователя при этом сводится только к поисковой работе в Консультанте: находит нужную информацию, выделяет её и копирует в буфер обмена, далее ищет следующую информацию..., т.е пользователь только создаёт поток, а вставка в WORD и переключение окон должно происходить "в тени".
Как это решить средствами AutoIt ??? Подскажите, если можно???
Заранее всех благодарю за участие в решении этой задачи!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
krapo
Как-то так у меня получилось:
Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <Word.au3>
#include <Misc.au3>

Opt("TrayMenuMode", 1)

Global $sFileName = @MDAY & '_' & @MON & '_' & @HOUR & '-' & @MIN & '.doc'
Global $Form1, $Edit1, $Edit2, $Button1, $oWordApp, $oDoc, $hExit, $sFromClip, $bCheck = True

ClipPut('')

$hExit = TrayCreateItem('Выход')
TraySetState()

#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Test", 600, 400, -1, -1, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
GUICtrlCreateLabel("Ваши комментарии:", 100, 8, 150, 17, $SS_CENTER, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$Edit1 = GUICtrlCreateEdit("", 20, 30, 560, 60, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN))
$Edit2 = GUICtrlCreateEdit("", 20, 110, 560, 270, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN))
$Button1 = GUICtrlCreateButton("Сохранить", 500, 5, 80, 20)
GUISetState(@SW_HIDE)
#endregion ### END Koda GUI section ###

While 1
	Sleep(2)
	$sFromClip = ClipGet()
	If $sFromClip Then
		ClipPut('')
		GUICtrlSetData($Edit2, $sFromClip)
		If _IsPressed('78') Then ;кнопка F9
			While _IsPressed('78')
				$sFromClip = ClipGet()
				If $sFromClip Then
					$sFromClip = GUICtrlRead($Edit2) & @CRLF
					$sFromClip &= ClipGet()
					GUICtrlSetData($Edit2, $sFromClip)
					ClipPut('')
				EndIf
				Sleep(2)
			WEnd
		EndIf
		GUISetState(@SW_SHOW)
		GUICtrlSetState($Edit1, $GUI_FOCUS)
	EndIf
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			GUICtrlSetData($Edit1, '')
			GUICtrlSetData($Edit2, '')
			GUISetState(@SW_HIDE)
		Case $Button1
			GUISetState(@SW_HIDE)
			If $bCheck Then
				$oWordApp = _WordCreate('', 0, 0)
				$oDoc = _WordDocGetCollection($oWordApp, 0)
				_WordDocSaveAs($oDoc, @TempDir & '\' & $sFileName)
				$bCheck = False
			EndIf
			_MyWordSave()
			GUICtrlSetData($Edit1, '')
			GUICtrlSetData($Edit2, '')
	EndSwitch
	$msg = TrayGetMsg()
	Switch $msg
		Case $hExit
			If Not $bCheck Then
				_WordQuit($oWordApp)
				FileMove(@TempDir & '\' & $sFileName, @ScriptDir & '\' & $sFileName, 1)
			EndIf
			Exit
	EndSwitch
WEnd

Func _MyWordSave()
	Local $sCommentText = GUICtrlRead($Edit1)
	Local $sFromClipText = GUICtrlRead($Edit2)
	If $sCommentText Then
		$sCommentText = '"Комментарии: ' & $sCommentText & '"' & @CRLF & @CRLF
	Else
		$sCommentText = '"Нет комментариев."' & @CRLF & @CRLF
	EndIf
	$oDoc.Range.insertAfter($sCommentText & $sFromClipText & @CRLF & @CRLF & @CRLF)
	_WordDocSave($oDoc)
EndFunc   ;==>_MyWordSave
Файл Word создается в папке Temp и при выходе перемещается в папку со скриптом. Можно копировать при нажатой кнопке F9 куски по очереди до тех пор, пока кнопку F9 не отпустишь. Если в открытом окне нажать выход (Х), то все поля очистятся, запись в файл этого куска производиться не будет и окно скроется. Выход - по меню из трея.

PS
Проверял работу на Opera, а в ней какую кнопку не нажми, что-то делается. Кнопку можно назначить любую. Коды кнопок можно посмотреть в справке к функции _IsPressed().
 
Автор
K

krapo

Новичок
Сообщения
3
Репутация
0
madmasles сказал(а):
Как-то так у меня получилось:

Классное начало, madmasles!!! Я даже не ожидал что это действительно можно реализовать так удобно.
Мне надо будет немного потестировать, потом внесу ещё предложения по работе скрипта. Может даже сам что-то сделаю в скрипте тоже, т.к. начал осваивать AutoIt тоже.
А пока могу заметить лишь то, что создаваемый вордовский документ при выходе лучше копировать в подпапку с именем числа этого месяца в папку, где запущен скрипт.
Т.е. по нажатию кнопки выход в трэе чтобы сначала создавалась подпапка в папке со скриптом, а потом уже туда и переносился чтобы новый документ. Сам документ ты создаещь уже правильно, с указанием времени создания в заголовке, так что в подпапке нужный док всегда будет легко найти.
Работа с Консультантом реально ускоряется. С другими прогами будет похоже тоже самое в таких случаях.

И ещё... Подумай на досуге пожалуйста, как в меню трэя добавить функцию приостановка работы скрипта и запуск с точки последней записи. Это что-то типа переключения между обычной работой с буфером обмена и пакетными копированием - вставкой в вордовский документ.
Неплохо было бы также если бы в создаваемом вновь документе Ворда в первой строке вводился заголовок создаваемого документа в соответсвующем формате (центровка по центру и более крупный жирный шрифт).
Неплохо было бы также сделать запись документа без выхода из программы.
А вообще спасибо! Для начала очень неплохо..!!! Работать с буфером обмена в пакетной обработке стало намного удобнее!!!
:IL_AutoIt_1:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
krapo [?]
в создаваемом вновь документе Ворда в первой строке вводился заголовок создаваемого документа
Какой заголовок должен быть? Может быть, заголовок активного окна или другой.
 
Автор
K

krapo

Новичок
Сообщения
3
Репутация
0
madmasles сказал(а):
Какой заголовок должен быть? Может быть, заголовок активного окна или другой.

Да. Возможно что заголовок активного окна. Так проще наверное...
А вообще было бы неплохо, если бы заголовок был самой первой меткой в копии потока...
То есть при первой вставке чтобы вылетало это самое окошко, только там должно быть ещё одно поле для заголовка. По умолчанию туда пусть копируется заголовок активного окна... Просто чтобы эта строка заголовка ещё и редактироваться могла, и чтобы если строка заголовка не понравится, чтобы пользователь мог ввести любой другой заголовок. Ну и при остальных вставках её можно просто сворачивать и не учитывать во вставках...
 
Верх