Scroll Explorer on middle mouse button drag

Post your working scripts, libraries and tools
aph
Posts: 7
Joined: 29 Jan 2018, 21:53

Scroll Explorer on middle mouse button drag

02 Feb 2018, 22:05

This script makes Explorer scroll like Chrome and other windows when middle clicked.

Code: Select all

; Description: Scroll Explorer on middle mouse button drag
; Permalink: https://autohotkey.com/boards/viewtopic.php?t=43715
; Author: aph
; Version: 0.2
$*MButton::
    MouseGetPos, CursorX, CursorY, Window, ClassNN
    WinGetTitle, Title, ahk_id %Window%
    WinGetClass, ahk_class, ahk_id %Window%
    WinGet ahk_exe, ProcessName, ahk_id %Window%
    WinGet ahk_PID, PID, ahk_id %Window%
    WinGetText, VisibleText, ahk_id %Window%
    MouseGetPos, CursorX_ended, CursorY_ended, Window_ended, ClassNN_ended
    WinGetClass, ahk_class_ended, ahk_id %Window_ended%
    WinGet ahk_exe_ended, ProcessName, ahk_id %Window_ended%
    AllowedApp := ahk_exe = "explorer.exe" or ahk_exe = "mmc.exe" or ahk_exe = "systempropertiesadvanced.exe" or ahk_exe = "filezilla.exe" or ahk_exe = "7zFM.exe"
    AllowedText := InStr(VisibleText, "Tree View") or InStr(VisibleText, "FolderView")
    LimitedApp := ahk_exe = "cmd.exe"
    DisabledApp := ahk_class_ended = "Shell_TrayWnd" or ahk_class_ended = "WorkerW"
    if (AllowedText >= 1)
        AllowedText = 1
    If (DisabledApp) {
        SendInput, {MButton Down}
        Return
    }
    Else If (!AllowedApp and !LimitedApp and !AllowedText) {
        SendInput, {MButton Down}
        Return
    }
    Else {
        If (AllowedApp) {
            SendInput, {MButton}
        }
        MiddleScroll := 1
        SetSystemCursor("SIZEALL")
        Sensitivity = 10 ; How far the middle mouse wheel has to be dragged before scrolling is triggered
        MouseGetPos, X1, Y1, , c, 2
        OrigTimer := 50 ; How quickly the file list scrolls
        SetTimer, MBScroll, %OrigTimer%
        MBScroll:
            MouseGetPos, X2, Y2
            Distance := Abs(Y2-Y1)
            If (Distance >= Sensitivity) {
                Rounded := % Round((Distance / 200)**1.25+1)
                DllCall("SystemParametersInfo", UInt, 0x69, UInt, Round(Ln(Rounded)+1), UInt, 0, UInt, 0) ; Vary lines scrolled by distance of drag 
                Timer := Round(OrigTimer - (OrigTimer/2*Percent/100))
                SetTimer, MBScroll, %Timer%
                Percent := (A_ScreenHeight - (Max(Y1, Abs(Y1-A_ScreenHeight)) - Distance)) / A_ScreenHeight * 100
                SendInput, % "{Blind}{Wheel" (Y2 > Y1 ? "Down" : "Up") " " Rounded "}"
            }
        Return
        $*MButton Up::
            DllCall("SystemParametersInfo", UInt, 0x69, UInt, 3, UInt, 0, UInt, 0) ; Set back to 3 lines scrolled
            SetTimer, MBScroll, off
            SetSystemCursor()
            MiddleScroll := 0
            SendInput {MButton Up}
            SetSystemCursor(Cursor="") {
                SystemCursors := "32512IDC_ARROW|32513IDC_IBEAM|32514IDC_WAIT|32515IDC_CROSS|32516IDC_UPARROW|32642IDC_SIZENWSE|32643IDC_SIZENESW|32644IDC_SIZEWE|32645IDC_SIZENS|32646IDC_SIZEALL|32648IDC_NO|32649IDC_HAND|32650IDC_APPSTARTING|32651IDC_HELP"
                If (Cursor = "")
                    Return DllCall("SystemParametersInfo", "UInt", 0x57, "UInt", 0, "UInt", 0, "UInt", 0) 
                If (StrLen(SystemCursors) = 221)
                    Loop, Parse, SystemCursors, |
                        StringReplace, SystemCursors, SystemCursors, %A_LoopField%, % DllCall("LoadCursor", "UInt", 0, "Int", SubStr(A_LoopField, 1, 5)) A_LoopField
                If !(Cursor := SubStr(SystemCursors, InStr(SystemCursors "|", "IDC_" Cursor "|") - 5 - p := (StrLen(SystemCursors) - 221) / 14, 5))
                    MsgBox, 262160, %A_ScriptName% - %A_ThisFunc%(): Error, Invalid cursor name!
                Else
                    Loop, Parse, SystemCursors, |
                        DllCall("SetSystemCursor", "UInt", DllCall("CopyIcon", "UInt", Cursor), "Int", SubStr(A_LoopField, 6, p))
                }
        Return
    }
Return
Last edited by aph on 06 Feb 2018, 18:47, edited 2 times in total.
aph
Posts: 7
Joined: 29 Jan 2018, 21:53

Re: Scroll Explorer on middle mouse button drag

06 Feb 2018, 17:07

Updates:
  • 0.2:
    • Focus on controls within Explorer
    • Disable on taskbar and desktop
    • Stop dragging as soon as middle button is released, regardless if scrolling has started or not
    • Add support for:
      • Old-style open/save dialogs and other types of Explorer windows
      • MMC based dialogs (Event Viewer, Services, Group/Security Policy, Computer Management, etc.)
      • Advanced system settings / System Properties
      • Override default command prompt middle drag since it's too slow
      • 7-Zip
      • FileZilla
Last edited by aph on 06 Feb 2018, 19:26, edited 4 times in total.
User avatar
Cerberus
Posts: 98
Joined: 12 Jan 2016, 15:46

Re: Scroll Explorer on middle mouse button drag

06 Feb 2018, 17:18

Very interesting, cool idea!
User avatar
Delta Pythagorean
Posts: 423
Joined: 13 Feb 2017, 13:44
GitHub: DelPyth
Location: Equestria

Re: Scroll Explorer on middle mouse button drag

07 Feb 2018, 07:19

This is actually pretty smart! I would make some adjustments to make it a bit smoother but I don't have enough time I'm afraid :(
aph
Posts: 7
Joined: 29 Jan 2018, 21:53

Re: Scroll Explorer on middle mouse button drag

11 Feb 2018, 06:49

You mean in the style talked about in these threads?
If so, I should be able to get that working.

Right now testing exclusions for toolbars, using less exe-specific inclusions and adding more dialogs that browse files.
User avatar
Delta Pythagorean
Posts: 423
Joined: 13 Feb 2017, 13:44
GitHub: DelPyth
Location: Equestria

Re: Scroll Explorer on middle mouse button drag

11 Feb 2018, 18:19

Well, I'll tell you one thing;
Instead of doing something like this:

Code: Select all

If (Var = "Info") || (Var = "Data") || (Var = "Name")
Do something like:

Code: Select all

If (Var ~= "i)Info|Data|Name") ; 'i)' means that it ignores the case and looks for the characters (Lowercase or upper)
It's short, simple, and quick to manipulate.

Return to “Scripts and Functions”

Who is online

Users browsing this forum: cyruz and 22 guests