cyxstudio Posted May 2, 2016 Posted May 2, 2016 I have tried googling and searching the help file but to no avail. May i know how to trigger a function when an editbox is being copied? Like the javascript function oncopy where you assign a function to a <input> that will trigger a function when text is being copy from it. Any help is appreciated.
mikell Posted May 2, 2016 Posted May 2, 2016 One way could be subclassing to intercept WM_COPY messages It's a code from Danyfirex (adapted) #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPIShellEx.au3> $hGui = GUICreate("Input", 300, 118 ) $idInput = GUICtrlCreateInput("", 50, 50, 200, 18) $hInput = GUICtrlGetHandle($idInput ) $lab = GUICtrlCreateLabel( "copied text", 50, 20, 200, 18 ) ; Register callback function to subclass Input control $pInputProc = DllCallbackGetPtr( DllCallbackRegister( "InputProc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr" ) ) _WinAPI_SetWindowSubclass( $hInput, $pInputProc, 9999, 0 ) ; SubclassId = 9999, $pData = 0 GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd _WinAPI_RemoveWindowSubclass( $hInput, $pInputProc, 9999) GUIDelete( $hGui ) Exit ; InputProc callback function Func InputProc( $hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData ) Switch $iMsg Case $WM_COPY GuiCtrlSetData($lab, ControlCommand($hGui, "", $idInput, "GetSelected", "")) EndSwitch Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )[0] ; _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam) EndFunc
cyxstudio Posted May 8, 2016 Author Posted May 8, 2016 (edited) On 5/2/2016 at 8:56 PM, mikell said: One way could be subclassing to intercept WM_COPY messages It's a code from Danyfirex (adapted) #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPIShellEx.au3> $hGui = GUICreate("Input", 300, 118 ) $idInput = GUICtrlCreateInput("", 50, 50, 200, 18) $hInput = GUICtrlGetHandle($idInput ) $lab = GUICtrlCreateLabel( "copied text", 50, 20, 200, 18 ) ; Register callback function to subclass Input control $pInputProc = DllCallbackGetPtr( DllCallbackRegister( "InputProc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr" ) ) _WinAPI_SetWindowSubclass( $hInput, $pInputProc, 9999, 0 ) ; SubclassId = 9999, $pData = 0 GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd _WinAPI_RemoveWindowSubclass( $hInput, $pInputProc, 9999) GUIDelete( $hGui ) Exit ; InputProc callback function Func InputProc( $hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData ) Switch $iMsg Case $WM_COPY GuiCtrlSetData($lab, ControlCommand($hGui, "", $idInput, "GetSelected", "")) EndSwitch Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )[0] ; _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam) EndFunc Thx, i dont fully understand the code but i am trying to learn. I just started coding autoit 2 weeks ago. This will take time. Thx, i dont fully understand the code but i am trying to learn. I just started coding autoit 2 weeks ago. This will take time. Just realised that edit box cannot control + A !! Edited May 8, 2016 by cyxstudio
InunoTaishou Posted May 8, 2016 Posted May 8, 2016 Normally most people would suggest using an Accelerator for Ctrl + A to select all in the edit box, but since you're already subclassing the edit (an input box is the same as an edit, just different window styles) you can do it like this expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPIShellEx.au3> #include <GuiEdit.au3> $hGui = GUICreate("Input", 300, 118) $lab = GUICtrlCreateLabel("copied text", 50, 10, 200, 18) $idInput = GUICtrlCreateEdit("", 10, 30, 280, 80) $hInput = GUICtrlGetHandle($idInput) ; Register callback function to subclass Input control $pInputProc = DllCallbackGetPtr(DllCallbackRegister("EditProc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr")) _WinAPI_SetWindowSubclass($hInput, $pInputProc, 9999, 0) ; SubclassId = 9999, $pData = 0 GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd _WinAPI_RemoveWindowSubclass($hInput, $pInputProc, 9999) GUIDelete($hGui) Exit ; InputProc callback function Func EditProc($hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData) Switch ($iMsg) Case $WM_COPY GUICtrlSetData($lab, ControlCommand($hGui, "", $idInput, "GetSelected", "")) Case $WM_CHAR If ($wParam = 1) Then Return _GUICtrlEdit_SetSel($hWnd, 0, -1) EndSwitch Return DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)[0] ; _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam) EndFunc ;==>EditProc (Changed the input control to an edit, included GUIEdit.au3, and added the Case $WM_CHAR for the Switch on $iMsg)
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now