vb6的热键问题,纠结了一晚上
以前在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
F12肯定被哪个进程注册了......换一个吧.... 好吧。。。我试试。
如果能检查出来哪个进程注册了就好了。 检测出来了要卸载也不容易.
还是换个热键吧.
或者使用键盘HOOK:
封装了一个键盘鼠标HOOK类,使用方便(VB6.0)http://www.m5home.com/blog/default.asp?id=245 本帖最后由 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是可以设为热键用的) 不使用注册热键,也不使用HOOK的话,就还有一招,那就是调用getkeystate:【VB声明】
Private Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer
【说明】
针对已处理过的按键,在最近一次输入信息时,判断指定虚拟键的状态
【返回值】
Integer,如开关键打开,则位0设为1(开关键包括CapsLock,
NumLock,ScrollLock);如某个键当时正处于按下状态,则位15为1;如已经抬起,则为0
【参数表】
nVirtKey -------Long,欲测试的虚拟键键码。对字母、数字字符(A-Z、a-z、0-9),用它们实际的ASCII值用个定时器不断调用它,判断你要的键是否被按下,就行了. 用定时器不断调用的话,会不会太耗资源?
因为有时候开很多号,本身很负重的。
(不一定非用F10,可以换个热键用的。)
我想基于ydj404606848的热键例程,参考老马的那个类的写法,做个封装类增加一些属性啥的。 回复 wanren2008 的帖子
定时器本身是极低优先级的,只要你在定时器过程里不做消耗CPU的操作,就不会有问题.
就这个应用而言,应该不会有效率问题.
页:
[1]