Что нового

Как отследить событие вставки данных из буфера обмена в RichEdit

pvnn

Осваивающий
Сообщения
282
Репутация
31
Доброго времени суток
Как можно отследить событие вставки данных из буфера обмена в RichEdit, то есть событие происходящее после нажатия клавиш Ctrl+V или Shift+Insert или нужно анализировать именно нажатие клавиш?
Код:
; AutoIt Version: 3.3.12.0

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 541, 326, -1, -1)
$TreeView1 = GUICtrlCreateTreeView(8, 8, 161, 249)
$Button1 = GUICtrlCreateButton("Button1", 233, 278, 75, 25)

$hRichEdit = _GUICtrlRichEdit_Create($Form1, '',  176, 8, 354, 250, BitOR($ES_MULTILINE, $WS_VSCROLL,$WS_HSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_CHANGE ) ; Родительскому окну высылать уведомление: $ENM_CHANGE
$RichEditChange = GUICtrlCreateDummy()

GUIRegisterMsg( $WM_COMMAND, "WM_COMMAND" )
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $RichEditChange
			$RichEditText=_GUICtrlRichEdit_GetText($hRichEdit)	; Возвращает весь текст
			ConsoleWrite(@CRLF&$RichEditText)
	EndSwitch
WEnd


Func WM_COMMAND( $hWnd, $iMsg, $wParam, $lParam )
  Local $hWndFrom = $lParam
  Local $iCode = BitShift( $wParam, 16 )
  Local $ID = BitAND($wParam, 0xFFFF)
  Switch $hWndFrom
	  Case $hRichEdit
		  Switch $iCode
			Case $EN_CHANGE ; Изменение данных в контроле
			  GUICtrlSendToDummy( $RichEditChange )	; Посылает сообщения $RichEditChange
		  EndSwitch
  EndSwitch
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1 162
Репутация
242
Может проще мониторить RichEdit на предмет изменения значения в нём ?
 
Автор
P

pvnn

Осваивающий
Сообщения
282
Репутация
31
ra4o сказал(а):
Может проще мониторить RichEdit на предмет изменения значения в нём ?
Можно запоминать введенный текст и сравнивать с новым, если тот изменился больше чем на 2 символа, то считать, что это вставка из буфера. Проблема будет если вставить такой же длины текст

Код:
; AutoIt Version: 3.3.12.0

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>
Global $gRichEditLenght=0

$Form1 = GUICreate("Form1", 541, 326, -1, -1)
$TreeView1 = GUICtrlCreateTreeView(8, 8, 161, 249)
$Button1 = GUICtrlCreateButton("Button1", 233, 278, 75, 25)

$hRichEdit = _GUICtrlRichEdit_Create($Form1, '',  176, 8, 354, 250, BitOR($ES_MULTILINE, $WS_VSCROLL,$WS_HSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_CHANGE ) ; Родительскому окну высылать уведомление: $ENM_CHANGE
$RichEditChange = GUICtrlCreateDummy()

GUIRegisterMsg( $WM_COMMAND, "WM_COMMAND" )
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $RichEditChange
			ConsoleWrite(@CRLF&_GUICtrlRichEdit_GetTextLength($hRichEdit,True,True))
			If Abs(_GUICtrlRichEdit_GetTextLength($hRichEdit,True,True)-$gRichEditLenght) > 2 Then ConsoleWrite(@CRLF&'Вставка из буфера')
			$RichEditText=_GUICtrlRichEdit_GetText($hRichEdit)	; Возвращает весь текст
			$gRichEditLenght=_GUICtrlRichEdit_GetTextLength($hRichEdit,True,True)	; Запомнить количество символов в RichEdit
	EndSwitch
WEnd


Func WM_COMMAND( $hWnd, $iMsg, $wParam, $lParam )
  Local $hWndFrom = $lParam
  Local $iCode = BitShift( $wParam, 16 )
  Local $ID = BitAND($wParam, 0xFFFF)
  Switch $hWndFrom
	  Case $hRichEdit
		  Switch $iCode
			Case $EN_CHANGE ; Изменение данных в контроле
			  GUICtrlSendToDummy( $RichEditChange )	; Посылает сообщения $RichEditChange
		  EndSwitch
  EndSwitch
EndFunc
 
Верх