VB.NET钩子的问题

SatByBed 2008-06-19 05:39:35
是酱紫的,我用VB6作了一个OCX控件(主要是用了一个DSOFramer来加载Word/Excel文档) , 然后在VB.NET那边用到了这个Ocx控件放在.NET的窗体上,然后.NET窗体上有一个按钮,我给这个按钮设置了快捷键(&C),现在的问题就来了,当窗口启动起来后,文档也能加载,都没问题,可是就是那个按钮的快捷键不起作用了(换任何字符都没用),然后我估计是DsoFramer本身的问题,我就仿照别人做了一个全局的键盘Hook,想以此来钩用户在DsoFramer控件里面编辑时,如果按了Alt+C的话,那么就向.NET做个那个主窗口重新发送Alt+C,我debug看得时候,的确是能钩到的,我是菜鸟,不知道怎么发送Alt+C这样一个组合键给.NET的做的那个主窗口,请高手赐教..
...全文
204 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 元老 2008-06-20
  • 打赏
  • 举报
回复
说明一下,相对而言Array的ReDim耗时较长这个是从VB6的一次测试中得到的结论,不一定适合.NET。
这样编写的代码比用单一变量记录WP更加健壮。这个。。。。。还是LZ自己编写代码过程中分析一下,自然会有结论,不深入讨论了,我是个业余爱好者,呵呵,讨论某些问题时总是出错,别误导大家才好。
if AltPress then
RaiseEvent HookKeyPress()
end if
处应该添加一行代码
if AltPress then
RaiseEvent HookKeyPress()
return 1
end if
真的睡觉了
清晨曦月 元老 2008-06-20
  • 打赏
  • 举报
回复
LZ过谦了,个人感觉HOOK的代码结构都是式样的,参照你的HOOK代码上面的应该很容易看明白,如果需要我可以把我的HOOK代码贴出来。
我的邮箱:shaoyan5@163.com
关于第三个问题我的实现方法可能效率不是很好,不过在没有找到更适合的方法之前,还是这样做吧:
思路:
在KeyDown被引发时,记录按键——直接记录那个数字:Wp,也可以可以是E.keycode.tostring但效率相对低,当上次的记录与本次按键相同时,引发KeyDown,若不同,则引发KeyPress。
将该按键压入数组,个人认为用ArrayList比较好,以为存储量不会很大,我们要求的是添加删除时的效率,相对而言Array的ReDim耗时较长,Sor……Ha……等一些表结构用在这里一方面是效率问题,另一方面可能“大材小用”了。
以可以处理任意与ALT组合键的通用方式处理,其代码如下:
这样编写的代码比用单一变量记录WP更加健壮。
dim Table as new arraylist(5) '初始化为存储5个——个人觉得,除非乱按,一般情况下同时按下的键不会超过3个
if Down then
if Table.Contains(wp) then ‘当按键存在于表中——处于Press状态
if AltPress then ‘当按下ALT与指定键时——如果LZ只指定C,则代码可以简化很多
RaiseEvent HookKeyDown()
Return 1 ‘这一句就是吃掉了这个按键
end if
else
Table.Add(wp) ’记录按键
if AltPress then
RaiseEvent HookKeyPress()
end if
end if
elseif Up then
if Table.Contains(wp) then ’这里主要是为了吃掉这个Up,否则可以只写Remove而无需判断
Table.Remove(wp)
return 1
end if
end if

昨天晚上没睡,代码可能有些疏漏,LZ自己写代码吧,我觉得已经非常清晰了,言尽于此。
SatByBed 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zcsor 的回复:]
0、应使用_LL钩子类别
[/Quote]
恩,是用的_LL钩子类别

[Quote=引用 3 楼 zcsor 的回复:]
1、ALT按下判别
[/Quote]
这个也可以判定

[Quote=引用 3 楼 zcsor 的回复:]
2、KeyDown将在按下后持续发生,应该转化为KeyPerss
[/Quote]
这个偶就有点菜了,不知道如何转化,可否赐教??

[Quote=引用 3 楼 zcsor 的回复:]
3、如果DsoFramer控件也使用ALT+C,则应把按键吃掉
[/Quote]
这个暂时先不考虑DsoFramer的问题


SatByBed 2008-06-20
  • 打赏
  • 举报
回复
谢谢以上3位的回复。
1,2楼的做法我试过了,还是不行。
3楼的办法,因为偶是菜鸟,没明白怎么弄。。。。
不如您给留个mail,我把我测试用的例子工程发过去,耽误您点时间,麻烦看看应该怎么改?
清晨曦月 元老 2008-06-19
  • 打赏
  • 举报
回复
表发送吧,若你的钩子直接写到了窗体里,直接调用按钮事件即可;若封装成类后调用,使用事件驱动即可。
钩子呢,需要注意处理这样几个问题,
0、应使用_LL钩子类别
1、ALT按下判别
2、KeyDown将在按下后持续发生,应该转化为KeyPerss
3、如果DsoFramer控件也使用ALT+C,则应把按键吃掉
大体应该是这样的吧(以不用吃掉按键,且使用事件驱动模式为例)

dim AltDown as bo
……
elseif xxxxxx = wm_keyup orelse xxxxxx then
if AltDown then
’激发事件 Hook
end if
end if

'窗体内处理这个事件,可以进行如下调用
sub Hook()
button1_click(nothing,nothing)
end sub

当然了,使用AddHandle也可以。
true01 2008-06-19
  • 打赏
  • 举报
回复
失败原因可能是KeyPreview为false, 窗体属性KeyPreview是否已经设成true;
  • 打赏
  • 举报
回复
winform里有个from有个属性keypreview,试试看

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧