Win32 - SetScrollInfo - Wiederherstellen der Scrollposition

GlockMane88

Lt. Commander
Registriert
Aug. 2008
Beiträge
1.244
Hi Leute,

ich habe ein AHK Script gefunden und für meine Zwecke angepasst, welches die Scrollposition eines Fensters speichert, dann das Fenster aktualisiert und die Scrollposition wiederherstellt..

Leider macht das Script nur eine Art Vorschau (Balken wird restored, aber ausgegraut und geht dann wieder zurück, bleibt also nicht an der gespeicherten Position stehen)..

Nun probiere ich schon eine Stunde, komme allerdings nicht weiter, ich denke es geht um diesen Aufruf:

Code:
r := DllCall("SetScrollInfo", "UInt", sbHwnd, "Int", SB_VERT, "UInt", &scrollInfo, "UInt", 1)

Wahrscheinlich ist das eine absolute Kleinigkeit, aber ich komme einfach nicht drauf.. Danke schonmal!

Hier das komplette Script:

Code:
#Include DllCallStruct.ahk

SB_VERT = 1
SIF_POS = 4
SCROLLINFO_SIZE := 7 * 4
method = NEW

^F5::
    progHwnd := WinExist("A")
    ControlGet sbHwnd, Hwnd, , SysListView323, ahk_id %progHwnd%
    If method = OLD
    {
        pos := DllCall("GetScrollPos", "UInt", sbHwnd, "Int", SB_VERT)
    }
    Else
    {
        VarSetCapacity(scrollInfo, SCROLLINFO_SIZE, 0)
        SetInteger(scrollInfo, SCROLLINFO_SIZE)
        SetInteger(scrollInfo, SIF_POS, 4)
        r := DllCall("GetScrollInfo", "UInt", sbHwnd, "Int", SB_VERT, "UInt", &scrollInfo)
    }
    If (ErrorLevel != 0 || A_LastError != 0)
        ; Can be ERROR_NO_SCROLLBARS=1447 || ERROR_INVALID_WINDOW_HANDLE=1400
        MsgBox Oops! (%A_LastError% / %ErrorLevel%)
;~     MsgBox <%sbHwnd%> %pos% (%ErrorLevel% & %A_LastError%)
;~     MsgBox % DumpDWORDs(scrollInfo, SCROLLINFO_SIZE)

    Sleep, 500

    Send {F5}

    Sleep, 500

    If method = OLD
    {
        r := DllCall("SetScrollPos", "UInt", sbHwnd, "Int", SB_VERT
                , "Int", pos, "UInt", 0)
    }
    Else
    {
        r := DllCall("SetScrollInfo", "UInt", sbHwnd, "Int", SB_VERT
                , "UInt", &scrollInfo, "UInt", 1)
    }
    If (ErrorLevel != 0 || A_LastError != 0)
        ; Can be ERROR_NO_SCROLLBARS=1447 || ERROR_INVALID_WINDOW_HANDLE=1400
        MsgBox Oops! (%A_LastError% / %ErrorLevel%)
;~     MsgBox %r% <%sbHwnd%> %pos% (%ErrorLevel% & %A_LastError%)
Return
 
Nach ein bisschen Recherche habe ich SB_VERT durch SB_CTL ersetzt, funktioniert aber nicht, jetzt wird die Scrollbar nicht mal temporär zurückgesetzt..
 
Habe den Code mal aufs nötige reduziert:

Code:
#Include DllCallStruct.ahk

SIF_POS = 4
SCROLLINFO_SIZE := 7 * 4

^F5::
    progHwnd := WinExist("A")
    ControlGet sbHwnd, Hwnd, , SysListView323, ahk_id %progHwnd%

    VarSetCapacity(scrollInfo, SCROLLINFO_SIZE, 0)
    SetInteger(scrollInfo, SCROLLINFO_SIZE)
    SetInteger(scrollInfo, SIF_POS, 4)
    r := DllCall("GetScrollInfo", "UInt", sbHwnd, "Int", "1", "UInt", &scrollInfo)

    Sleep, 500

    Send {F5}

    Sleep, 500

    r := DllCall("SetScrollInfo", "UInt", sbHwnd, "Int", "1", "UInt", &scrollInfo, "UInt", 1)
Return

Die Scrollbar wird weiß, geht auf die gespeicherte Position, kurz danach aber auf die Position vom Fensterrefresh zurück..
 
Wenn ich nach dem Befehl

"r := DllCall("SetScrollInfo", "UInt", sbHwnd, "Int", "1", "UInt", &scrollInfo, "UInt", 1)"

ein weiteres "Send {F5}" einbaue, übernimmt er die Scrollposition!
 
Zurück
Oben