我想定义一些热键,就像金山词霸的那样,在一个textbox里,当按下ctrl,alt,shift时显示"ctrl+alt+",松开后显示无,只有当同时按下其他键时timer终止检测,将如ctrl+alt+shift+F1之类的热键存在注册表,其实这应该是段经典的定义热键的代码,可惜我没找到让我满意的,我自己做的总有些问题,还请各位高手给出一段,我可用分很多,一定给分!
解决方案 »
- 在VB生成exe之后,怎样才能够在别人的电脑上运行呢???请详细告诉我过程!!!
- 我认为isnumeric()函数有bug,不知大家以为如何,有例子
- mcisendstring播放avi,暂停时,当前帧的图像会被挡在前面的窗体抹去,如何解决?
- 请问如何在文本框刷卡得到的数据后,对文本框的内容进行自动查询??在线等就
- 执行rs.MoveFirst然后 rs.MoveNext,结果EditMode从2变成了0
- 一个VB的错误,不知道是什么原因
- 如何实现在Form_Load() 中的datagrid中 仅读取access数据库表中的字段名 而不读取数据
- ******lemonade征集毕业论文意见***********
- 有谁知道IPX的连接方法?高分相送(不敢开是给多了,有很大难度,以后一定加到100分)
- win2000的问题???
- 请问高手门,怎样从用SQL语句返回表中的有那些子段名
- 请求解释一下菜单中的checked属性,它有何作用????
'使任务栏显示图标,重复调用了前两个API,将其全局定义
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private 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 Long
Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, _
ByVal ID As Long, ByVal fskey_Modifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, _
ByVal ID As Long) As LongConst WM_HOTKEY = &H312
Const MOD_ALT = &H1
Const MOD_CONTROL = &H2
Const MOD_SHIFT = &H4
Const GWL_WNDPROC = (-4) '窗口函数的地址Dim Key_pWp As Long '用来保存窗口信息
Dim Key_Mod As Long, Key_uVK As Long, Key_ID As Long
Dim Key_isWinAdd As Boolean '是否取得窗口信息的判断
'------------------------------------'过程:注册热键
Public Sub HotKeyIn()
'------------------------------------------
SetHotkey 1, "38", "Add"
SetHotkey 2, "40", "Add"
SetHotkey 3, "38", "Add"
SetHotkey 4, "40", "Add" '下
End SubFunction keyWndproc(ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_HOTKEY Then
Select Case wParam 'wParam 值就是 key_id
'激活热键后,热键所对应的操作,可在其他的程序中,在此处 调用就可以了
Case 1
Case 2
Case 3
Case 4
End Select
End If
'将消息传送给指定的窗口
keyWndproc = CallWindowProc(Key_pWp, hWnd, Msg, wParam, lParam)
'----------在窗体 Form_Load 事件中定义热键格式------------------ 'SetHotkey 1, "Ctrl,112", "Add" ' 按 Ctrl+F1 激活指定程序
'SetHotkey 2, 113, "Add" '按 F2 激活指定程序
'SetHotkey 3, "Ctrl+Alt,113", "Add" '按 Ctrl+Alt+F2 激活指定程序
'注:关于激活热键后的操作,由自定义函数 SetHotkey 的 KeyId 传送的值来判断'----------在窗体 Form_Unload 事件中注销热键格式---------------- 'SetHotkey 1, "", "Del" ' 退出程序是一定要用上的,不然会导至程序死掉
'SetHotkey 2, "", "Del"
'SetHotkey 3, "", "Del"
'---------------------------------------------------------------
End FunctionFunction SetHotkey(ByVal KeyId As Long, ByVal KeyAss0 As String, _
ByVal Action As String)
Dim lKey As Long
Dim sKey As String
Dim i As Long
i = InStr(1, KeyAss0, ",")
If i = 0 Then
lKey = Val(KeyAss0)
sKey = ""
Else
lKey = Right(KeyAss0, Len(KeyAss0) - i)
sKey = Left(KeyAss0, i - 1)
End If
Key_ID = 0
Key_Mod = 0
Key_uVK = 0
If Key_isWinAdd = False Then '判断是否需要取得窗口信息,如果重复取得, _
再最后恢复窗口时,将会造成程序死掉
'记录原来的window程序地址
Key_pWp = GetWindowLong(frmMain.hWnd, GWL_WNDPROC)
'用自定义程序代替原来的window程序
SetWindowLong frmMain.hWnd, GWL_WNDPROC, AddressOf keyWndproc
End If Key_ID = KeyId
Select Case Action
Case "Add"
Select Case sKey
Case "Ctrl"
Key_Mod = MOD_CONTROL
Case "Alt"
Key_Mod = MOD_ALT
Case "Shift"
Key_Mod = MOD_SHIFT
Case "Ctrl+Alt"
Key_Mod = MOD_CONTROL + MOD_ALT
Case "Ctrl+Shift"
Key_Mod = MOD_CONTROL + MOD_SHIFT
Case "Ctrl+Alt+Shift"
Key_Mod = MOD_CONTROL + MOD_ALT + MOD_SHIFT
Case "Shift+Alt"
Key_Mod = MOD_SHIFT + MOD_ALT
End Select
Key_uVK = Val(lKey)
'向窗口注册系统热键
RegisterHotKey frmMain.hWnd, Key_ID, Key_Mod, Key_uVK
'不需要再取得窗口信息
Key_isWinAdd = True
Case "Del"
SetWindowLong frmMain.hWnd, GWL_WNDPROC, Key_pWp '恢复窗口信息
UnregisterHotKey frmMain.hWnd, Key_uVK '取消系统热键
Key_isWinAdd = False '可以再次取得窗口信息
End Select
End Function
Private Function MyHotKey(vKeyCode) As Boolean
MyHotKey = ((GetAsyncKeyState(vKeyCode) < 0))
End Function
然后,建立一个 timer 控件,输入以下代码:
Sub timer1_timer()
If myHotKey(vbkeyX) then … ' 这里的 vbkeyX 是指系统热键为 X
End Sub
Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Const VK_CONTROL = &H11
Private Const VK_F1 = &H70
Private Const VK_SHIFT = &H10
Private Const VK_ALT = &H12Private Sub Timer1_Timer()
Dim intKey As Integer
Dim lKey(3) As Long
Dim sKey(3) As String
Dim i As Integer
lKey(0) = VK_CONTROL
lKey(1) = VK_SHIFT
lKey(2) = VK_ALT
lKey(3) = VK_F1
sKey(0) = "Ctrl"
sKey(1) = "SHIFT"
sKey(2) = "ALT"
sKey(3) = "F1"
Text1 = ""
For i = 0 To 3
intKey = (GetAsyncKeyState(lKey(i)) And &HFF00) / 2 ^ 15
If intKey = -1 Then
Text1 = Text1 + sKey(i) + "+"
End If
NextEnd Sub