热键程序的API与AESII我会写.但是我关键一个问题就是热键的设置与组合问题。像QQ或者金山快译的热键设置时,文本框可以自动检测,我输的入的组合键,并且是在一次操作完成的。是如何实现这些功能的呢?
例如:
1.我按下CTRL+A他会自动检测到我按了两个键,
2.ALT+CTRL+1 他会自动检测了我按了三个键,并且按我的先后顺序排列。
3.我只输入B他就自动检测一个键。以上的热键设置时的设计流程如何,是否要用时间控件来检测呢?有相关的例子吗?
例如:
1.我按下CTRL+A他会自动检测到我按了两个键,
2.ALT+CTRL+1 他会自动检测了我按了三个键,并且按我的先后顺序排列。
3.我只输入B他就自动检测一个键。以上的热键设置时的设计流程如何,是否要用时间控件来检测呢?有相关的例子吗?
解决方案 »
- 大家快帮忙看看,救命啊,解决了再加分
- 运行程序时总显示with块变量未设置是什么原因阿?
- 在word的VBA代码中,Application.ScreenUpdating=False不能关闭刷屏
- 求所有的Err.Number代表的意思。
- 大家的源程序是怎么管理的?
- 帮忙看看,我的这个语句有什么错误,谢谢您的支持.在线等候!!
- shellexecute 的问题?
- 请教用vb来update sql的一个问题
- 老问题。。picturebox读取access数据画曲线。。
- 这个项目该接吗?
- 水晶报表问题解决放分afang98(小酷) heiheidan(想抢别人老婆)
- 关于RealAudio1方面的编程?
Private Declare Function MapVirtualKey Lib "user32.dll" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As LongPrivate Sub TextHotKey_KeyDown(KeyCode As Integer, Shift As Integer)
SetKeyShift = Shift
If KeyCode > 20 Then SetKeyCode = KeyCode Else SetKeyCode = 0
Show_Key
End SubPrivate Sub TextHotKey_KeyUp(KeyCode As Integer, Shift As Integer)
If SetKeyCode = 0 And Shift = 0 Then SetKeyShift = 0: Show_Key
End SubPrivate Sub Show_Key()
If SetKeyCode = 0 And SetKeyShift = 0 Then TextHotKey.Text = "无": Exit Sub
Dim KeyName As String
If SetKeyShift And 1 Then KeyName = KeyName & "Shift + "
If SetKeyShift And 2 Then KeyName = KeyName & "Ctrl + "
If SetKeyShift And 4 Then KeyName = KeyName & "Alt + "
Dim kn As String * 20, l As Long
l = GetKeyNameText(MapVirtualKey(SetKeyCode, 0) * 65536 + 1, kn, 19)
KeyName = KeyName & Left$(kn, l)
TextHotKey.Text = KeyName
End Sub
需要一个Text,名字为TextHotKey。而且,TextHotKey要locked=true。
我的程序中是这样的:
Modifiers = 0
If SetKeyShift And 1 Then Modifiers = Modifiers + 4
If SetKeyShift And 2 Then Modifiers = Modifiers + 2
If SetKeyShift And 4 Then Modifiers = Modifiers + 1Modifiers 和 SetKeyCode 就可以用了。
些祥细的便例子
你的意思是这样吗:假如一个窗体设置了热键(如ctrl+atl+b)
当窗体最小化时只要按这三个键就可以显示窗体吗
若是这样,我做过,不用时间控件.
Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long注册系统热键:
If SetKeyCode Then RegisterHotKey Me.hwnd, 1, Modifiers, SetKeyCode
解除:
UnregisterHotKey Me.hwnd, 1
(其中这个1是个编号,可以自己定义。如果要多个热键,要设置成不同的编号。)
另外,注册后,系统会向窗口发消息。需要重定义窗口函数。
定义窗口函数:
lpPrevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
还原:
SetWindowLong Me.hwnd, GWL_WNDPROC, lpPrevWndProc很重要的是,要在模块中加入如下代码:
Public Const WM_HOTKEY = &H312
Public Const GWL_WNDPROC = (-4)
Public lpPrevWndProc As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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 LongFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_HOTKEY Then
If wParam = 1 Then '这个1还是编号
'你要做什么写在这里。比如说 Form1.Show 。注意,这里不能用Me。
End If
End If
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function