ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] ★☆★☆★☆★☆★☆★☆★获取Excel鼠标动作的COM加载项

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-9-12 11:18 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
获取Excel鼠标动作.gif

源码下载: Excel Events.rar (10.73 KB, 下载次数: 177)

标准模块代码:
  1. Option Explicit

  2. Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  3. '寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;
  4. '该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)

  5. Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
  6. '在窗口列表中寻找与指定条件相符的第一个子窗口

  7. Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  8. '从指定窗口的结构中取得信息

  9. Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  10. '在窗口结构中为指定的窗口设置信息

  11. Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  12. '将消息传答窗口函数

  13. Public hwnd5      As Long
  14. Public preWinProc As Long

  15. Public xlapp      As Application

  16. Public Const GWL_WNDPROC = (-4)

  17. Public Const WM_MOUSEMOVE = &H200
  18. Public Const WM_LBUTTONDOWN = &H201
  19. Public Const WM_RBUTTONDOWN = &H204
  20. Public Const WM_MOUSEWHEEL = &H20A

  21. Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

  22.     '以下会截取Mouse
  23.     Select Case Msg

  24.         Case WM_MOUSEMOVE
  25.             Debug.Print "鼠标移动"

  26.         Case WM_LBUTTONDOWN
  27.             MsgBox "你按了左键"

  28.         Case WM_RBUTTONDOWN
  29.             MsgBox "你按了右键"

  30.         Case WM_MOUSEWHEEL

  31.             '写下事件
  32.             If wParam > 0 Then           '正数是上滚
  33.                            
  34.                 MsgBox "滚轮向上↑↑↑"
  35.             Else
  36.                 MsgBox "滚轮向下↓↓↓"
  37.                            
  38.             End If

  39.     End Select

  40.     '将之送往原来的Window Procedure
  41.     WndProc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
  42.    
  43. End Function

复制代码
设计器代码
  1. Option Explicit

  2. Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)

  3.     '设置应用程序变量
  4.     Set xlapp = Application

  5.     Dim hwnd1, hWndDesk

  6.     hwnd1 = FindWindow("XLMAIN", xlapp.Caption)
  7.     hWndDesk = FindWindowEx(hwnd1, 0&, "XLDESK", vbNullString)
  8.     '注释:     取得Excel编辑区
  9.     hwnd5 = FindWindowEx(hWndDesk, 0&, "EXCEL7", vbNullString)    'Excel 主窗体
  10.    
  11.     '注释:     记录原本的Window Procedure的位址
  12.     preWinProc = GetWindowLong(hwnd5, GWL_WNDPROC)
  13.     '注释:     设定EditBox的window Procedure到wndproc
  14.     SetWindowLong hwnd5, GWL_WNDPROC, AddressOf WndProc
  15.    
  16. End Sub

  17. Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)

  18.     '从内存中缷载插件时处理
  19.     '取消Message的截取,而使之又只送往原来的Window Procedure

  20.     SetWindowLong hwnd5, GWL_WNDPROC, preWinProc

  21.     '释放占用的内存
  22.     Set xlapp = Nothing

  23. End Sub
复制代码

[ 本帖最后由 zanjero 于 2009-9-12 11:34 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-9-12 11:25 | 显示全部楼层
牛呀。先收藏了,现在还看不懂

TA的精华主题

TA的得分主题

发表于 2009-9-12 11:27 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-9-12 17:41 | 显示全部楼层
原帖由 zyg365 于 2009-9-12 17:12 发表
重新发布的Dll文件不能正常使用,提示:“运行时错误13,类型不匹配”


我这边是好的啊

有源码,自己调试吧

TA的精华主题

TA的得分主题

发表于 2009-9-12 17:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 1楼 zanjero 的帖子

重新发布的Dll文件不能正常使用,提示:“运行时错误13,类型不匹配”

TA的精华主题

TA的得分主题

发表于 2009-9-14 08:38 | 显示全部楼层

回复 5楼 zanjero 的帖子

你的附件中的Dll文件可以正常使用,但用你的附件中的源码重新发布为Dll文件就不能正常使用。
我的Excel为2000

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-9-14 08:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 zyg365 于 2009-9-14 08:38 发表
你的附件中的Dll文件可以正常使用,但用你的附件中的源码重新发布为Dll文件就不能正常使用。
我的Excel为2000

再发,这个应该是一样的,在我这重新发布也正常,xp+vb 6.0 sp6+office2003
Excel Events.rar (10.72 KB, 下载次数: 49)

TA的精华主题

TA的得分主题

发表于 2009-9-14 14:27 | 显示全部楼层

回复 7楼 zanjero 的帖子

在我这问题依旧?????????

[ 本帖最后由 zyg365 于 2009-9-14 14:30 编辑 ]

VB6.0+Excel2000下程序发布.rar

17.12 KB, 下载次数: 31

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-9-14 16:49 | 显示全部楼层
原帖由 zyg365 于 2009-9-14 14:27 发表
在我这问题依旧?????????


你上传的附件是好的,问题可能出在编译或运行环境上

TA的精华主题

TA的得分主题

发表于 2009-9-14 16:58 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 11:46 , Processed in 0.044576 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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