找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7607|回复: 7

[求助] vb6的热键问题,纠结了一晚上

 火.. [复制链接]

7

主题

38

回帖

0

精华

铜牌会员

积分
247
发表于 2011-3-28 09:06:35 | 显示全部楼层 |阅读模式
以前在CSDN上就拜读过嗷嗷叫的老马的文章,受益匪浅。也非常感谢!
这次找vb6下关于热键的技术文章,找来找去都是语焉不详,包括网上王国荣VC写的那个dll。也许水平有限,看了半天还是不知道该如何用。终于还是下载看了老马的那个例子,大致明白了。

于是自己试着测试了一下,那个热键类没有任何改动,只是建了一个form,然后注册3个热键,
但是发现第3个怎么也注册不成功,于是又加个GetLastError来看API调用错误,发现是1409(热键已注册)。
不知道怎么回事,特来求教。源码附上。敬请指点。
不能上传文件啊。那就说下吧。
类cHotkey原样照抄,一字没改。只是加了一些debug.Print。
建了一个From,在里边注册了3个热键:F10,F11,F12。
运行调试,发现在F12注册时,返回热键已注册的错误,注册失败。
在cHotKey里边加了句:(GetLastError已声明:Private Declare Function GetLastError Lib "kernel32" () As Long)
    I = RegisterHotKey(mfrmHwnd, KeyAtom(UBound(KeyAtom)), K, HotKey)
       Debug.Print "HotKeyRegister:  " & I & ";    GetLastError: " & GetLastError
注册F10和F11时,没出错,立即窗口:HotKeyRegister:  1;    GetLastError: 0
注册F12时,立即窗口:HotKeyRegister:  0;    GetLastError: 1409

Form源码:
---------------------------------------------------------------------------------------
Option Explicit

Dim WithEvents myHotKey As cHotkey
Dim hkIndex(3) As Integer

Private Sub Form_Load()
    Set myHotKey = New cHotkey
    myHotKey.frmHwnd = Me.hwnd
   
    Debug.Print "==========" & myHotKey.frmHwnd
   
    hkIndex(0) = myHotKey.AddHotKey(vbKeyF10) - 1
    hkIndex(1) = myHotKey.AddHotKey(vbKeyF11) - 1
    hkIndex(2) = myHotKey.AddHotKey(vbKeyF12) - 1    '<--这个注册失败了
    Debug.Print hkIndex(0) & ",  " & hkIndex(1) & ",  " & hkIndex(2)
    myHotKey.StartHotKeys Timer1
End Sub

Private Sub Form_Unload(Cancel As Integer)
    myHotKey.ClsAllHotKey
    Set myHotKey = Nothing
End Sub

Private Sub myHotKey_HotKeyPress(ByVal HotKeyIndex As Long, ByVal HotKey As Long, ByVal hCtrl As Boolean, ByVal hAlt As Boolean, ByVal hShift As Boolean)
    MsgBox "Hot Key press!"
    If HotKeyIndex = vbKeyF10 Then
        MsgBox "F10"
    End If
End Sub

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-3-28 14:16:30 | 显示全部楼层
F12肯定被哪个进程注册了......换一个吧....
我就是嗷嗷叫的老马了......

7

主题

38

回帖

0

精华

铜牌会员

积分
247
 楼主| 发表于 2011-3-28 18:22:33 | 显示全部楼层
好吧。。。我试试。
如果能检查出来哪个进程注册了就好了。

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-3-28 19:17:15 | 显示全部楼层
检测出来了要卸载也不容易.

还是换个热键吧.

或者使用键盘HOOK:

封装了一个键盘鼠标HOOK类,使用方便(VB6.0)http://www.m5home.com/blog/default.asp?id=245
我就是嗷嗷叫的老马了......

7

主题

38

回帖

0

精华

铜牌会员

积分
247
 楼主| 发表于 2011-3-28 22:00:19 | 显示全部楼层
本帖最后由 wanren2008 于 2011-3-29 07:01 编辑

现在这里有3个涉及到的方法:
1)最先下了老马的:全局热键类的多热键示例工程
2)上午下了 热键例程.rar (http://www.m5home.com/bbs/thread-4715-1-1.html
3)刚才又下了楼上的那个全局键盘鼠标HOOK封装类

到底用哪个好一些呢?
-----------------------------------------------------------------------------
先说下我想做什么吧。
前不久用按键精灵做了个游戏辅助工具,开始就是做着玩,但是后来不断增加内容,
最后写了5000多行。毕竟按键精灵还是局限比较多,而且写来写去没啥意思。
就想用VB6来写。

首先就遇到热键问题,因为必须有一个热键把辅助工具呼出/隐去,还要有热键来开启、
暂停、中止。这个问题解决了,就可以真正写操作键鼠了。这个也不算外挂吧,毕竟
不去解封包,只是操作鼠标代替人手完成一些机械操作。
当然,驱动我去写这个的,纯粹因为个人对编程的爱好。

就像按键精灵一样,热键其实也就需要那么几个。所以帮我推荐一下哪种方法好?
(奇怪的是,按键精灵制作的脚本,F12是可以设为热键用的)

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-3-29 08:36:02 | 显示全部楼层
不使用注册热键,也不使用HOOK的话,就还有一招,那就是调用getkeystate:
  1. 【VB声明】
  2.   Private Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer

  3. 【说明】
  4.   针对已处理过的按键,在最近一次输入信息时,判断指定虚拟键的状态

  5. 【返回值】
  6.   Integer,如开关键打开,则位0设为1(开关键包括CapsLock,
  7.   NumLock,ScrollLock);如某个键当时正处于按下状态,则位15为1;如已经抬起,则为0

  8. 【参数表】
  9.   nVirtKey -------  Long,欲测试的虚拟键键码。对字母、数字字符(A-Z、a-z、0-9),用它们实际的ASCII值
复制代码
用个定时器不断调用它,判断你要的键是否被按下,就行了.
我就是嗷嗷叫的老马了......

7

主题

38

回帖

0

精华

铜牌会员

积分
247
 楼主| 发表于 2011-3-29 12:22:36 | 显示全部楼层
用定时器不断调用的话,会不会太耗资源?
因为有时候开很多号,本身很负重的。
(不一定非用F10,可以换个热键用的。)

我想基于ydj404606848的热键例程,参考老马的那个类的写法,做个封装类增加一些属性啥的。

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-3-29 13:03:22 | 显示全部楼层
回复 wanren2008 的帖子

定时器本身是极低优先级的,只要你在定时器过程里不做消耗CPU的操作,就不会有问题.

就这个应用而言,应该不会有效率问题.
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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