ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 19101|回复: 33

[分享] 列表框实现鼠标滚轮滚动Demo

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-2-18 10:04 | 显示全部楼层 |阅读模式
本帖最后由 一条狗 于 2016-2-18 10:07 编辑

在论坛一直潜水,快2年了!第一次发帖,功能如题
在论坛找了许久,一直没发现 合适的例子可以借鉴,于是自己就各种翻墙,查找资料并DIY这个使用API来控制的实例,现分享给大家,希望给更多人带来帮助

代发分为两部分,Userform和Module
Userform部分


  1. Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  2.     HookListBoxScroll
  3. End Sub

  4. Private Sub UserForm_Initialize()
  5.     LISTBOX_Post_Flag = 1
  6.     LISTBOX_Mouse_Flag = 1
  7.     Me.Label1.Caption = "默认:光标位置固定,仅滚轮滚动"
  8. End Sub

  9. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  10.     UnhookListBoxScroll
  11. End Sub

  12. Private Sub CommandButton1_Click()
  13.     LISTBOX_Post_Flag = 1
  14.     LISTBOX_Mouse_Flag = 1
  15.     Me.Label1.Caption = "当前状态:光标位置固定,仅滚轮滚动"
  16. End Sub

  17. Private Sub CommandButton2_Click()
  18.     LISTBOX_Post_Flag = 1
  19.     LISTBOX_Mouse_Flag = 2
  20.     Me.Label1.Caption = "当前状态:光标位置不固定,跟随滚轮滚动"
  21. End Sub


复制代码

Module部分
  1. Private Type POINTAPI
  2.     X As Long
  3.     Y As Long
  4. End Type

  5. Private Type MOUSEHOOKSTRUCT
  6.     pt As POINTAPI
  7.     hwnd As Long
  8.     wHitTestCode As Long
  9.     dwExtraInfo As Long
  10. End Type

  11. Private Declare Function FindWindow Lib "user32" _
  12.                                     Alias "FindWindowA" ( _
  13.                                                          ByVal lpClassName As String, _
  14.                                                          ByVal lpWindowName As String) As Long

  15. Private Declare Function GetWindowLong Lib "user32.dll" _
  16.                                        Alias "GetWindowLongA" ( _
  17.                                                                ByVal hwnd As Long, _
  18.                                                                ByVal nIndex As Long) As Long

  19. Private Declare Function SetWindowsHookEx Lib "user32" _
  20.                                           Alias "SetWindowsHookExA" ( _
  21.                                                                      ByVal idHook As Long, _
  22.                                                                      ByVal lpfn As Long, _
  23.                                                                      ByVal hmod As Long, _
  24.                                                                      ByVal dwThreadId As Long) As Long

  25. Private Declare Function CallNextHookEx Lib "user32" ( _
  26.                                                       ByVal hHook As Long, _
  27.                                                       ByVal nCode As Long, _
  28.                                                       ByVal wParam As Long, _
  29.                                                       lParam As Any) As Long

  30. Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
  31.                                                            ByVal hHook As Long) As Long

  32. Private Declare Function PostMessage Lib "user32.dll" _
  33.                                      Alias "PostMessageA" ( _
  34.                                                            ByVal hwnd As Long, _
  35.                                                            ByVal wMsg As Long, _
  36.                                                            ByVal wParam As Long, _
  37.                                                            ByVal lParam As Long) As Long

  38. Private Declare Function WindowFromPoint Lib "user32" ( _
  39.                                                        ByVal xPoint As Long, _
  40.                                                        ByVal yPoint As Long) As Long

  41. Private Declare Function GetCursorPos Lib "user32.dll" ( _
  42.                                                         ByRef lpPoint As POINTAPI) As Long

  43. Private Const WH_MOUSE_LL As Long = 14
  44. Private Const WM_MOUSEWHEEL As Long = &H20A
  45. Private Const HC_ACTION As Long = 0
  46. Private Const GWL_HINSTANCE As Long = (-6)

  47. Private Const WM_KEYDOWN As Long = &H100
  48. Private Const WM_KEYUP As Long = &H101
  49. Private Const VK_UP As Long = &H26
  50. Private Const VK_DOWN As Long = &H28
  51. Private Const WM_LBUTTONDOWN As Long = &H201

  52. Private mLngMouseHook As Long
  53. Private mListBoxHwnd As Long
  54. Private mbHook As Boolean
  55. Public LISTBOX_Post_Flag As Integer
  56. Public LISTBOX_Mouse_Flag As Integer

  57. Sub HookListBoxScroll()
  58.     Dim lngAppInst As Long
  59.     Dim hwndUnderCursor As Long
  60.     Dim tPT As POINTAPI
  61.     GetCursorPos tPT
  62.     hwndUnderCursor = WindowFromPoint(tPT.X, tPT.Y)
  63.     If mListBoxHwnd <> hwndUnderCursor Then
  64.         UnhookListBoxScroll
  65.         mListBoxHwnd = hwndUnderCursor
  66.         lngAppInst = GetWindowLong(mListBoxHwnd, GWL_HINSTANCE)
  67.         PostMessage mListBoxHwnd, WM_LBUTTONDOWN, 0&, 0&
  68.         If Not mbHook Then
  69.             mLngMouseHook = SetWindowsHookEx( _
  70.                                              WH_MOUSE_LL, AddressOf MouseProc, lngAppInst, 0)
  71.             mbHook = mLngMouseHook <> 0
  72.         End If
  73.     End If
  74. End Sub

  75. Sub UnhookListBoxScroll()
  76.     If mbHook Then
  77.         UnhookWindowsHookEx mLngMouseHook
  78.         mLngMouseHook = 0
  79.         mListBoxHwnd = 0
  80.         mbHook = False
  81.     End If
  82. End Sub

  83. Private Function MouseProc( _
  84.                            ByVal nCode As Long, ByVal wParam As Long, _
  85.                            ByRef lParam As MOUSEHOOKSTRUCT) As Long
  86.     On Error GoTo errH    'Resume Next
  87.     If (nCode = HC_ACTION) Then
  88.         If WindowFromPoint(lParam.pt.X, lParam.pt.Y) = mListBoxHwnd Then
  89.             If wParam = WM_MOUSEWHEEL Then
  90.                 MouseProc = True
  91.                 If lParam.hwnd > 0 Then
  92.                     If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 1 Then frm.ListBox1.TopIndex = frm.ListBox1.TopIndex - 1
  93.                     If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 2 Then PostMessage mListBoxHwnd, WM_KEYDOWN, VK_UP, 0
  94.                 Else
  95.                     If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 1 Then frm.ListBox1.TopIndex = frm.ListBox1.TopIndex + 1
  96.                     If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 2 Then PostMessage mListBoxHwnd, WM_KEYDOWN, VK_DOWN, 0
  97.                 End If
  98.                 PostMessage mListBoxHwnd, WM_KEYUP, VK_UP, 0
  99.                 Exit Function
  100.             End If
  101.         Else
  102.             UnhookListBoxScroll
  103.         End If
  104.     End If
  105.     MouseProc = CallNextHookEx( _
  106.                                mLngMouseHook, nCode, wParam, ByVal lParam)
  107.     Exit Function
  108. errH:
  109.     UnhookListBoxScroll
  110. End Function


复制代码




列表框滚动Demo.zip

19.91 KB, 下载次数: 1810

评分

14

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-4-4 10:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
先顶下,再学习。支持~~

TA的精华主题

TA的得分主题

发表于 2016-12-8 21:31 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-12-14 15:15 | 显示全部楼层
nine_sun 发表于 2016-12-8 21:31
很好,学习了,非常感谢

客气,只是资源整理了一下而已

TA的精华主题

TA的得分主题

发表于 2017-8-11 22:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢,先记号一下

TA的精华主题

TA的得分主题

发表于 2017-8-29 16:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-9-30 10:45 | 显示全部楼层
今天用到,学习一下,不然l老出现问题

TA的精华主题

TA的得分主题

发表于 2017-10-1 22:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-10-9 17:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
先留个脚印,到时候学习

TA的精华主题

TA的得分主题

发表于 2017-11-13 20:09 | 显示全部楼层
感谢大神,解决了我几个月的问题,非常感谢啊,也感谢EXCELHOME的小伙伴们
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 10:42 , Processed in 0.045356 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表