ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] corel VBA 钩子兼容问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-5-24 11:35 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 sifo-d 于 2012-5-24 11:40 编辑

我是新手,最近刚接触VBA,在coreldraw中准备写个小程序,顺便想加个钩子,我是在win7 64位下写的,在win7下能正常钩,并写vba7 vba6都兼容了,但是我放到xp下就不行了,hHook一直等于0,钩不住,求解答,win7 64位下很正常
  1. #If VBA7 = False Then
  2.     Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( _
  3.             ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  4.             
  5.     Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  6.    
  7.     Private Declare Function CallNextHookEx Lib "user32" ( _
  8.             ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
  9.    
  10.     Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Long, ByVal Length As Long)
  11.     Private Declare Function GetAsyncKeyStateA Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer
  12. #Else
  13.     Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( _
  14.             ByVal idHook As LongPtr, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As LongPtr) As Long
  15.             
  16.     Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As Long
  17.    
  18.     Private Declare PtrSafe Function CallNextHookEx Lib "user32" ( _
  19.             ByVal hHook As LongPtr, ByVal nCode As LongPtr, ByVal wParam As LongPtr, lParam As Any) As Long
  20.    
  21.     Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As LongPtr, ByVal Length As LongPtr)
  22.     Private Declare PtrSafe Function GetAsyncKeyStateA Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As LongPtr) As Integer
  23. #End If

  24. Private hHook As Long
  25. Private Const WH_KEYBOARD_LL = 13
  26. Private Const WM_KEYDOWN = &H100
  27. Dim num As Long


  28. Private Type LpConvert
  29. vkCode As Long
  30. scanCode As Long
  31. flags As Long
  32. time As Long
  33. dwExtraInfo As Long
  34. End Type


  35. '设置键盘钩子
  36. Sub setHook()
  37. If hHook = 0 Then
  38.         hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf hookFunc, Application.ID, 0)
  39.         #If VBA7 Then
  40.             MsgBox "vba7" + CStr(hHook)
  41.         #Else
  42.             MsgBox "vba6"
  43.         #End If
  44. End If
  45. End Sub

  46. '解除钩子过程
  47. Sub unloadHook()
  48.     If hHook <> 0 Then
  49.         Call UnhookWindowsHookEx(hHook)
  50.         hHook = 0
  51.         MsgBox ("已解除钩子")
  52.     End If
  53. End Sub

  54. '钩子响应程序
  55. #If VBA7 = False Then
  56.     Private Function hookFunc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  57.         Static lpconv As LpConvert
  58.         
  59.         If nCode < 0 Then
  60.             hookFunc = CallNextHookEx(hHook, nCode, wParam, lParam)
  61.             Exit Function
  62.         End If
  63.         
  64.       
  65.         Call CopyMemory(lpconv, ByVal lParam, Len(lpconv))
  66.       
  67.         If wParam = WM_KEYDOWN And lpconv.vkCode = vbKeyH And (32768 + GetAsyncKeyStateA(vbKeyControl) = 1) Then
  68.            main.pageTotal.Caption = num + 1        '这块代码只是用来测试学习
  69.         num = num + 1
  70.         End If
  71.         
  72.     End Function
  73. #Else
  74.     Private Function hookFunc(ByVal nCode As LongPtr, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
  75.         Static lpconv As LpConvert
  76.         
  77.         If nCode < 0 Then
  78.             hookFunc = CallNextHookEx(hHook, nCode, wParam, lParam)
  79.             Exit Function
  80.         End If
  81.         
  82.         Call CopyMemory(lpconv, ByVal lParam, Len(lpconv)) '将lparam转换为键盘编码///////////////////////////////////////////
  83.         
  84.         If wParam = WM_KEYDOWN And lpconv.vkCode = vbKeyH Then
  85.            main.pageTotal.Caption = (GetAsyncKeyStateA(vbKeyControl))
  86.         num = num + 1
  87.         End If
  88.         
  89.     End Function
  90. #End If
复制代码

TA的精华主题

TA的得分主题

发表于 2012-5-24 11:39 | 显示全部楼层
去CSDN问         

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-24 11:41 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-24 11:59 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-24 12:03 | 显示全部楼层
反正我也学了多时,钩子就象个钩子钩到我心里了,总搞不定,

我估计,除了版主,与几位高手之外,这里的人更多是偏重数据处理的多

也许不太易得到答案,

算是帮顶吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-24 12:14 | 显示全部楼层
谢谢,我就纳闷,win7下,coreldraw好几个版本都可以完美运行,就是到xp下没反应了,也不报错

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-24 12:16 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-24 14:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-24 14:54 | 显示全部楼层
sifo-d 发表于 2012-5-24 11:59
我去看了下,vba区不怎么火

去csdn的vb版问,我以前在xp下vb6可以勾的,但现在全忘了。

TA的精华主题

TA的得分主题

发表于 2014-9-4 09:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个问题真是头疼,隔行如隔山
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-29 07:26 , Processed in 0.045963 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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