BugFix Posted January 2 Share Posted January 2 Most editors have the option of scrolling horizontally with the combination Shift+mouse wheel. SciTE does not offer this by default. I call the following script compiled at Windows startup. The scrolling speed is set as a multiplier via an INI file (filename.exe = filename.ini). The default, even without an INI file, is 3. ; INI: [HScroll] speed=3 expandcollapse popup;-- TIME_STAMP 2024-01-02 15:58:13 #include <WinAPI.au3> #include <WindowsConstants.au3> Opt('TrayIconHide', 1) OnAutoItExitRegister('OnAutoItExit') ;~ HotKeySet('^+q', '_Exit') ; Strg+Shift+Q - during testing Global $iSpeed = 3 ; Factor for multiplying the wheel steps Global $INI = StringTrimRight(@ScriptFullPath, 4) & '.ini' If FileExists($INI) Then $iSpeed = IniRead($INI, 'HScroll', 'speed', 3) EndIf Global $gSciTECmd GUIRegisterMsg(74, "MY_WM_COPYDATA") ; $WM_COPYDATA = 74 Global Const $HC_ACTION = 0 Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam") Global $hmod = _WinAPI_GetModuleHandle(0) Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod) Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam") Global $hHookKey = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod) Global $gbShift = False, $gbCtrl = False While True Sleep(50) WEnd Func _MouseProc($nCode, $wParam, $lParam) Local $tInfo, $wheelCount $tInfo = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam) If $nCode < 0 Or _GetHwnd_SciTE() = Null Or $gbShift = False Or $gbCtrl Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam) If $nCode = $HC_ACTION Then Switch $wParam Case $WM_MOUSEWHEEL $wheelCount = _WinAPI_HiWord($tInfo.mouseData)/120 SendSciTE_Command('extender:dostring do editor:LineScroll(' & $wheelCount*$iSpeed*(-1) & ',0) end') EndSwitch EndIf Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam) EndFunc Func _KeyProc($nCode, $wParam, $lParam) Local $tKEYHOOKS, $vkCode, $ID $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam) If $nCode < 0 Or _GetHwnd_SciTE() = Null Then Return _WinAPI_CallNextHookEx($hHookKey, $nCode, $wParam, $lParam) $vkCode = DllStructGetData($tKEYHOOKS, "vkCode") If $wParam = $WM_KEYDOWN Then If $vkCode = 0xA0 Or $vkCode = 0xA1 Then ; left or right shift-button pressed $gbShift = True ElseIf $vkCode = 0xA2 Or $vkCode = 0xA3 Then ; left or right ctrl-button pressed $gbCtrl = True EndIf Else Switch DllStructGetData($tKEYHOOKS, "flags") Case 0x80, 0x81 ; 0x80= UP for 'normal' keys and left pairs, 0x81= UP for right pairs If $vkCode = 0xA0 Or $vkCode = 0xA1 Then ; LShift, RShift $gbShift = False ElseIf $vkCode = 0xA2 Or $vkCode = 0xA3 Then ; LCtrl, RCtrl $gbCtrl = False EndIf EndSwitch EndIf Return _WinAPI_CallNextHookEx($hHookKey, $nCode, $wParam, $lParam) EndFunc Func _Exit() Exit EndFunc Func OnAutoItExit() _WinAPI_UnhookWindowsHookEx($hHook) DllCallbackFree($hStub_MouseProc) _WinAPI_UnhookWindowsHookEx($hHookKey) DllCallbackFree($hStub_KeyProc) EndFunc ;==>OnAutoItExit Func _GetHwnd_SciTE() Local $hScite = WinGetHandle('[ACTIVE]') If _WinAPI_GetClassName($hScite) = 'SciTEWindow' Then Return $hScite Else Return SetError(1, 0, Null) EndIf EndFunc Func _GetHwndDirectorExtension() Local $hActive = WinGetHandle('[ACTIVE]') Local $PIDActive = WinGetProcess($hActive) Local $aExtension = WinList("DirectorExtension") Local $PIDExt For $i = 1 To $aExtension[0][0] $PIDExt = WinGetProcess($aExtension[$i][1]) If $PIDExt = $PIDActive Then Return $aExtension[$i][1] Next EndFunc ; by Jos Func SendSciTE_Command($_sCmd, $Wait_For_Return_Info=0) Local $WM_COPYDATA = 74 Local $Scite_hwnd = _GetHwndDirectorExtension() ; Get SciTE DIrector Handle Local $My_Hwnd = GUICreate("AutoIt3-SciTE interface") ; Create GUI to receive SciTE info Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2)) ; Convert my Gui Handle to decimal $_sCmd = ":" & $My_Dec_Hwnd & ":" & $_sCmd ; Add dec my gui handle to commandline to tell SciTE where to send the return info Local $CmdStruct = DllStructCreate('Char[' & StringLen($_sCmd) + 1 & ']') DllStructSetData($CmdStruct, 1, $_sCmd) Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr') DllStructSetData($COPYDATA, 1, 1) DllStructSetData($COPYDATA, 2, StringLen($_sCmd) + 1) DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct)) $gSciTECmd = '' DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _ 'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _ 'Ptr', DllStructGetPtr($COPYDATA)) GUIDelete($My_Hwnd) If $Wait_For_Return_Info Then Local $n = 0 While $gSciTECmd = '' Or $n < 10 Sleep(20) $n += 1 WEnd EndIf Return $gSciTECmd EndFunc ;==>SendSciTE_Command Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam) Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam) Local $gSciTECmdLen = DllStructGetData($COPYDATA, 2) Local $CmdStruct = DllStructCreate('Char[' & $gSciTECmdLen+1 & ']',DllStructGetData($COPYDATA, 3)) $gSciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $gSciTECmdLen) EndFunc ;==>MY_WM_COPYDATA SciTE_ScrollH.au3 Musashi and donnyh13 1 1 Best Regards BugFix Link to comment Share on other sites More sharing options...
donnyh13 Posted January 2 Share Posted January 2 Thanks ! Just as a side note, the Beta Scite Jos is working on has Shift+Scroll enabled by default. LibreOffice UDF ; Scite4AutoIt Spell-Checker Using LibreOffice Spoiler "Life is chiefly made up, not of great sacrifices and wonderful achievements, but of little things. It is oftenest through the little things which seem so unworthy of notice that great good or evil is brought into our lives. It is through our failure to endure the tests that come to us in little things, that the habits are molded, the character misshaped; and when the greater tests come, they find us unready. Only by acting upon principle in the tests of daily life can we acquire power to stand firm and faithful in the most dangerous and most difficult positions." Link to comment Share on other sites More sharing options...
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