不懂怎么用SBM_SETSCROLLINFO 我试了如下代码,但是鼠标移到窗口中,滚动条又回到原来的位置了。。Option Explicit '滚动条信息结构体 Public Type SCROLLINFO cbSize As Long fMask As Long nMin As Long nMax As Long nPage As Long nPos As Long nTrackPos As Long End Type Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function GetScrollInfo Lib "user32" (ByVal hwnd As Long, ByVal n As Long, lpScrollInfo As SCROLLINFO) As Long Public Declare Function SetScrollInfo Lib "user32" (ByVal hwnd As Long, ByVal n As Long, lpcScrollInfo As SCROLLINFO, ByVal bool As Boolean) As Long Public Const SIF_RANGE = &H1 Public Const SIF_PAGE = &H2 Public Const SIF_POS = &H4 Public Const SIF_ALL = SIF_RANGE Or SIF_PAGE Or SIF_POS Public Const SB_HORZ = 0 Public Const SB_VERT = 1 Public Const SB_CTL = 2 Public Const WM_HSCROLL = &H114 Public Const WM_VSCROLL = &H115 Public Const SBM_SETSCROLLINFO = 233Public Const SB_LINEUP = 0 Public Const SB_LINEDOWN = 1
Option ExplicitPrivate Sub Command1_Click() Dim si As SCROLLINFO si.cbSize = Len(si) si.fMask = SIF_POS GetScrollInfo &H2501FC, SB_VERT, si si.nPos = 20 SetScrollInfo &H2501FC, SB_VERT, si, True 'SendMessage &H80250, WM_VSCROLL, SB_LINEUP, 0 'SendMessage &H80250, WM_VSCROLL, SB_LINEDOWN, 0 'SendMessage &H80250, SBM_SETSCROLLINFO, 0, si End Sub
马马虎虎自己解决了Option ExplicitPrivate Sub Command1_Click() Dim si As SCROLLINFO, ScrollPos As Long, Distance As Long, PageRoute As Long, LineRoute As Long, i As Long Dim MyHwnd As Long MyHwnd = &H5B026C si.cbSize = Len(si) si.fMask = SIF_ALL GetScrollInfo MyHwnd, SB_VERT, si ScrollPos = CLng(InputBox("请输入需要滚动到的位置!")) If ScrollPos < si.nMin Or ScrollPos > si.nMax Then MsgBox "超出滚动范围" Exit Sub End If 'si.nPos = 20 'SetScrollInfo &H5B026C, SB_VERT, si, True Distance = ScrollPos - si.nPos PageRoute = Abs(Distance \ si.nPage) LineRoute = Abs(Distance Mod si.nPage) Select Case Distance Case Is > 0 For i = 1 To PageRoute SendMessage MyHwnd, WM_VSCROLL, SB_PAGEDOWN, 0 Next i For i = 1 To (LineRoute + PageRoute) SendMessage MyHwnd, WM_VSCROLL, SB_LINEDOWN, 0 Next i Case Is < 0 For i = 1 To PageRoute SendMessage MyHwnd, WM_VSCROLL, SB_PAGEUP, 0 Next i For i = 1 To (LineRoute + PageRoute) SendMessage MyHwnd, WM_VSCROLL, SB_LINEUP, 0 Next i End Select GetScrollInfo MyHwnd, SB_VERT, si MsgBox "期望值:" & ScrollPos & vbCrLf & "实际值:" & si.nPos 'SendMessage &H5B026C, WM_VSCROLL, SB_LINEUP, 0 'SendMessage &H80250, WM_VSCROLL, SB_LINEDOWN, 0 'SendMessage &H80250, SBM_SETSCROLLINFO, 0, si End Sub
然后怎么根据滚动条位置,刷新窗口内容
我试了如下代码,但是鼠标移到窗口中,滚动条又回到原来的位置了。。Option Explicit
'滚动条信息结构体
Public Type SCROLLINFO
cbSize As Long
fMask As Long
nMin As Long
nMax As Long
nPage As Long
nPos As Long
nTrackPos As Long
End Type
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function GetScrollInfo Lib "user32" (ByVal hwnd As Long, ByVal n As Long, lpScrollInfo As SCROLLINFO) As Long
Public Declare Function SetScrollInfo Lib "user32" (ByVal hwnd As Long, ByVal n As Long, lpcScrollInfo As SCROLLINFO, ByVal bool As Boolean) As Long
Public Const SIF_RANGE = &H1
Public Const SIF_PAGE = &H2
Public Const SIF_POS = &H4
Public Const SIF_ALL = SIF_RANGE Or SIF_PAGE Or SIF_POS
Public Const SB_HORZ = 0
Public Const SB_VERT = 1
Public Const SB_CTL = 2
Public Const WM_HSCROLL = &H114
Public Const WM_VSCROLL = &H115
Public Const SBM_SETSCROLLINFO = 233Public Const SB_LINEUP = 0
Public Const SB_LINEDOWN = 1
Option ExplicitPrivate Sub Command1_Click()
Dim si As SCROLLINFO
si.cbSize = Len(si)
si.fMask = SIF_POS
GetScrollInfo &H2501FC, SB_VERT, si
si.nPos = 20
SetScrollInfo &H2501FC, SB_VERT, si, True
'SendMessage &H80250, WM_VSCROLL, SB_LINEUP, 0
'SendMessage &H80250, WM_VSCROLL, SB_LINEDOWN, 0
'SendMessage &H80250, SBM_SETSCROLLINFO, 0, si
End Sub
Dim si As SCROLLINFO, ScrollPos As Long, Distance As Long, PageRoute As Long, LineRoute As Long, i As Long
Dim MyHwnd As Long
MyHwnd = &H5B026C
si.cbSize = Len(si)
si.fMask = SIF_ALL
GetScrollInfo MyHwnd, SB_VERT, si
ScrollPos = CLng(InputBox("请输入需要滚动到的位置!"))
If ScrollPos < si.nMin Or ScrollPos > si.nMax Then
MsgBox "超出滚动范围"
Exit Sub
End If
'si.nPos = 20
'SetScrollInfo &H5B026C, SB_VERT, si, True
Distance = ScrollPos - si.nPos
PageRoute = Abs(Distance \ si.nPage)
LineRoute = Abs(Distance Mod si.nPage)
Select Case Distance
Case Is > 0
For i = 1 To PageRoute
SendMessage MyHwnd, WM_VSCROLL, SB_PAGEDOWN, 0
Next i
For i = 1 To (LineRoute + PageRoute)
SendMessage MyHwnd, WM_VSCROLL, SB_LINEDOWN, 0
Next i
Case Is < 0
For i = 1 To PageRoute
SendMessage MyHwnd, WM_VSCROLL, SB_PAGEUP, 0
Next i
For i = 1 To (LineRoute + PageRoute)
SendMessage MyHwnd, WM_VSCROLL, SB_LINEUP, 0
Next i
End Select
GetScrollInfo MyHwnd, SB_VERT, si
MsgBox "期望值:" & ScrollPos & vbCrLf & "实际值:" & si.nPos
'SendMessage &H5B026C, WM_VSCROLL, SB_LINEUP, 0
'SendMessage &H80250, WM_VSCROLL, SB_LINEDOWN, 0
'SendMessage &H80250, SBM_SETSCROLLINFO, 0, si
End Sub