versión original por lexikos en el antiguo foro (versión reescrita para trabajar con AutoHotKey 2)
Nota: probado solo en WIN_10 x32
Añadir barras de desplazamiento horizontal y vertical a una ventana - útil para ventanas con muchos controles en pantallas pequeñas
Link: https://github.com/flipeador/AutoHotKey ... ollBar.ahk
Code: Select all
UpdateScrollBars(hWnd) {
VarSetCapacity(RECT, 16, 0), DllCall("User32.dll\GetClientRect", "Ptr", hWnd, "Ptr", &RECT)
, Width := NumGet(RECT, 8, "Int") - NumGet(RECT, 0, "Int"), Height := NumGet(RECT, 12, "Int") - NumGet(RECT, 4, "Int")
, Left := Top := 9999, Right := Bottom := 0
for Index, ControlId in WinGetControlsHwnd("ahk_id " hWnd)
ControlGetPos(cx, cy, cw, ch,, "ahk_id " ControlId)
, (cx < Left) ? Left := cx : ""
, (cy < Top) ? Top := cy : ""
, (cx + cw > Right) ? Right := cx + cw : ""
, (cy + ch > Bottom) ? Bottom := cy + ch : ""
Left -= SysGet(2) // 2, Top -= SysGet(2) // 2, Right += SysGet(2) // 2, Bottom += SysGet(2) // 2
, ScrollWidth := Right-Left, ScrollHeight := Bottom-Top
, NumPut(VarSetCapacity(SCROLLINFO, 7 * 4, 0), SCROLLINFO, 0, "UInt"), NumPut(1 | 2, SCROLLINFO, 4, "UInt")
, NumPut(ScrollWidth, SCROLLINFO, 12, "Int"), NumPut(Width, SCROLLINFO, 16, "Int")
, DllCall("User32.dll\SetScrollInfo", "Ptr", hWnd, "Int", 0, "Ptr", &SCROLLINFO, "Int", true)
, NumPut(ScrollHeight, SCROLLINFO, 12, "Int"), NumPut(Height, SCROLLINFO, 16, "Int")
, DllCall("User32.dll\SetScrollInfo", "Ptr", hWnd, "Int", 1, "Ptr", &SCROLLINFO, "Int", true)
, (Left < 0 && Right < Width) ? (x := Abs(Left) > Width-Right ? Width-Right : Abs(Left)) : ""
, (Top < 0 && Bottom < Height) ? (y := Abs(Top) > Height-Bottom ? Height-Bottom : Abs(Top)) : ""
, (x || y) ? DllCall("User32.dll\ScrollWindowEx", "Ptr", hWnd, "Int", x, "Int", y, "Ptr", 0, "Ptr", 0, "Ptr", 0, "Ptr", 0, "UInt", 1 | 2 | 4) : ""
}
OnScroll(wParam, lParam, Message, hWnd) {
ScrollBars := {0x114: "WM_HSCROLL", 0x115: "WM_VSCROLL"}
, ScrollBarTypes := {0: "SB_HORZ", 1: "SB_VERT" , WM_HSCROLL: 0, WM_VSCROLL: 1}
, Action := wParam & 0xFFFF
, ScrollBar := ScrollBars[Message] ;WM_HSCROLL = barra horizontal | WM_VSCROLL = barra vertical
, ScrollBarType := ScrollBarTypes[ScrollBar] ;0 = barra horizontal | 1 = barra vertical
, NumPut(VarSetCapacity(SCROLLINFO, 7 * 4, 0), SCROLLINFO, 0, "UInt"), NumPut(1 | 2 | 4, SCROLLINFO, 4, "UInt")
, DllCall("User32.dll\GetScrollInfo", "Ptr", hWnd, "Int", ScrollBarType, "Ptr", &SCROLLINFO)
, VarSetCapacity(RECT, 16, 0)
, DllCall("User32.dll\GetClientRect", "Ptr", hWnd, "Ptr", &RECT)
, (Action = 0) ? Pos := NumGet(SCROLLINFO, 20, "Int") - 10 : Pos := NumGet(SCROLLINFO, 20, "Int")
, (Action = 1) ? Pos += 10 : ""
, (Action = 2) ? Pos -= NumGet(rect, 12, "Int") - 10 : ""
, (Action = 3) ? Pos += NumGet(rect, 12, "Int") - 10 : ""
, (Action = 5 || action = 4) ? Pos := wParam >> 16 : ""
, (Action = 6) ? Pos := NumGet(SCROLLINFO, 8, "Int") : ""
, (Action = 7) ? Pos := NumGet(SCROLLINFO, 12, "Int") : ""
if (!(Action >= 0) && !(Action < 8)) || (Action = 4)
return
(Pos > NumGet(SCROLLINFO, 12, "Int") - NumGet(SCROLLINFO, 16, "UInt")) ? Pos := NumGet(SCROLLINFO, 12, "Int") - NumGet(SCROLLINFO, 16, "UInt") : ""
, (Pos < NumGet(SCROLLINFO, 8, "Int")) ? Pos := NumGet(SCROLLINFO, 8, "Int") : ""
, (ScrollBarType = 0) ? (y := 0) . (x := NumGet(SCROLLINFO, 20, "Int") - Pos) : (x := 0) . (y := NumGet(SCROLLINFO, 20, "Int") - Pos)
, DllCall("User32.dll\ScrollWindowEx", "Ptr", hWnd, "Int", x, "Int", y, "Ptr", 0, "Ptr", 0, "Ptr", 0, "Ptr", 0, "UInt", 1 | 2 | 4)
, NumPut(Pos, SCROLLINFO, 20, "Int")
, DllCall("User32.dll\SetScrollInfo", "Ptr", hWnd, "Int", ScrollBarType, "Ptr", &SCROLLINFO, "Int", true)
}
Ejemplo (revisión 22/04/2018):
Code: Select all
; registrar los mensajes enviados cuando el usuario interactua con la barra de desplazamiento de la ventana
OnMessage(0x115, "OnScroll") ;WM_VSCROLL
OnMessage(0x114, "OnScroll") ;WM_HSCROLL
; creamos gui 1
Gui := GuiCreate("+Resize +0x300000")
Loop 8
Gui.AddEdit("R5 W400", "Edit #" . A_Index)
Gui.AddButton(, "Hola soy un botón")
; creamos gui 2
Gui2 := GuiCreate("+Resize +0x300000")
Tab := Gui2.AddTab3("w999 h999 -Wrap", "a|e|i|u|o")
Loop 20
{
Tab.UseTab(A_Index = 6 ? "" : A_Index)
Gui2.AddListView("w999 h999", "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|1|2|3|4|5|6|7|8|9|0")
}
Gui2.Show("y200 h150 w200")
Gui.Show("y0 h150 w200")
Gui.OnEvent("Size", (g) => UpdateScrollBars(g.hwnd))
Gui2.OnEvent("Size", (g) => UpdateScrollBars(g.hwnd))
Gui.OnEvent("Close", "ExitApp")
Gui2.OnEvent("Close", "ExitApp")
; Habilitar la rueda del mouse para desplazar la barra
#If ( WinActive("ahk_id" . Gui.Hwnd) )
WheelUp::
WheelDown::
+WheelUp:: ;mantener SHIFT precionado para mover la barra horizontal
+WheelDown::
OnScroll(!!InStr(A_ThisHotkey,"Down"), 0, GetKeyState("Shift") ? 0x114 : 0x115, gui.hWnd)
OnScroll(!!InStr(A_ThisHotkey,"Down"), 0, GetKeyState("Shift") ? 0x114 : 0x115, gui2.hWnd)
return
#If