Что нового

Событие обновление Буфера обмена

1dark1

Новичок
Сообщения
16
Репутация
0
Написал скрипт для отправки текста из буфера в промт делает это по запуску скрипта.
Вопрос как можно сделать чтобы не надо было не перезапускать скрипт а чтобы отслеживалось изменение(появления нового) текста в буфере) и после выполнялся скрипт.
Код:
#Include <WinAPI.au3>

$PID = WinWait("[ACTIVE]", "", 1)
$hWnd = WinGetHandle("Переводчик PROMT")
Sleep(300)
WinActivate ($hWnd, "") 
WinActive("Переводчик PROMT")
WinSetOnTop($hWnd, "", 1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "^a")
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{DEL}")
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "+{ins}")
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{F9}")
_SendMessage($hWnd, 0x6, 0x1)
WinActivate ($PID, "")
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Вот я сам тоже интересовался этим вопросом и ничего не нашол.
Вот если только в цыкле отслеживать изменения и вызывать соответствующую функцию.
Сейчас я пользуюсь такой штукой.
Код:
HotKeySet("{esc}", "_quit")
Func _quit()
Exit
EndFunc
$clip1 = ClipGet()
While 1
  $clip2 = ClipGet()
  If @error = 0 And $clip1 <> $clip2 Then
   $clip1 = $clip2
   OnClipCopy($clip2)
EndIf
  Sleep(100)
WEnd
Func OnClipCopy($sClipStr)
   MsgBox(64, "ClipBoardEvent", "Скопированный текст изменён на "&$sClipStr)
; // Здесь может быть ваш код...
EndFunc
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Вот накидал по быстрому из того, что вспомнил.
Код:
#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <GUIConstantsEx.au3>

Global $NextClipboardViewer

HotKeySet('{F2}','_exit')

Global $hWnd = GUICreate('clip')
GUIRegisterMsg($WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD")
GUIRegisterMsg($WM_CHANGECBCHAIN, "WM_CHANGECBCHAIN")

Local $aResult = DllCall('user32.dll','ptr','SetClipboardViewer','hwnd',$hWnd)
$NextClipboardViewer = $aResult[0]
Local $Msg
While 1
    Sleep(10)
	$Msg = GUIGetMsg()
WEnd

Func _exit()
	Exit
EndFunc

Func WM_CHANGECBCHAIN($hWnd, $iMsg, $wParam, $lParam)
    if ($wParam = $NextClipboardViewer) Then
        $NextClipboardViewer = $lParam
	Else
		_SendMessage($NextClipboardViewer, $WM_CHANGECBCHAIN, $wParam, $lParam)
	EndIf
    Return 0
EndFunc


Func WM_DRAWCLIPBOARD($hWnd, $iMsg, $wParam, $lParam)
     ConsoleWrite('Буфер обмена изменен:' & @CR & ClipGet() & @CR )
	_SendMessage($NextClipboardViewer, $hWnd, $iMsg, $wParam, $lParam)
EndFunc


PS: Оказалось в AutoIT уже есть готовые функции для этого. Прошелся по ссылке в вышестоящем посте и ... в общем там все расписано.
 
Автор
1

1dark1

Новичок
Сообщения
16
Репутация
0
Спасибо всем скрипт показаный alex33 выполняет все нужные мне действия тема решена.
 
Верх