'---------------------------------------------------------------------------------------
' Module : Module1
' DateTime : 2005-10-12 00:14
' Author : Lingll
' Email : lingll_xl@163.com
' Purpose : TranslateAccelerator sample
'---------------------------------------------------------------------------------------
Option Explicit
Public Declare Function GetMessage Lib "user32.dll" Alias "GetMessageA" (ByRef lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Public Declare Sub PostQuitMessage Lib "user32.dll" (ByVal nExitCode As Long)
Public Declare Function TranslateAccelerator Lib "user32.dll" Alias "TranslateAcceleratorA" (ByVal hwnd As Long, ByVal hAccTable As Long, ByRef lpMsg As MSG) As Long
Public Declare Function CreateAcceleratorTable Lib "user32.dll" Alias "CreateAcceleratorTableA" (ByVal lpaccl As Long, ByVal cEntries As Long) As Long
Public Declare Function DestroyAcceleratorTable Lib "user32.dll" (ByVal haccel As Long) As Long
Public Declare Function TranslateMessage Lib "user32.dll" (ByRef lpMsg As MSG) As Long
Public Declare Function DispatchMessage Lib "user32.dll" Alias "DispatchMessageA" (ByRef lpMsg As MSG) As Long
Public Type POINTAPI
x As Long
y As Long
End Type
Public Type MSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Public Type ACCEL
fVirt As Integer
key As Integer
cmd As Integer
'rev As Integer
End Type
Public Const FSHIFT As Long = &H4
Public Const FCONTROL As Long = &H8
Public Const FALT As Long = &H10
Public Const FNOINVERT As Long = &H2
Public Const FVIRTKEY As Long = 3 ' 131
Public Const WM_COMMAND As Long = &H111
Public Const VK_F11 As Long = &H7A
Public Const WM_KEYDOWN As Long = &H100
Sub Main()
Dim tHwnd&
tHwnd = Form1.hwnd
Form1.Show
Dim tMsg As MSG
Dim tVk(0 To 1) As ACCEL
'Ctrl+C
With tVk(0)
.cmd = 102
.fVirt = FVIRTKEY Or FCONTROL
.key = vbKeyC
End With
'F8
With tVk(1)
.cmd = 101
.fVirt = FVIRTKEY Or FCONTROL
.key = vbKeyF8
End With
Dim tTable&
tTable = CreateAcceleratorTable(VarPtr(tVk(0)), 2)
While (GetMessage(tMsg, 0, 0, 0) <> 0)
If TranslateAccelerator(tHwnd, tTable, tMsg) = 0 Then
Call TranslateMessage(tMsg)
Call DispatchMessage(tMsg)
End If
Wend
DestroyAcceleratorTable (tTable)
End Sub
对form1做子类处理,响应WM_COMMAND消息,
记得在程序退出时 PostQuitMessage (0)
什么情况下需要:当用api创建菜单的时候,当想要动态改变菜单快捷键的时候
by lingll
lingll_xl@163.com
lingll.yeah.net
这篇博客展示了如何在Visual Basic(VB)中使用API函数创建和处理加速键(Accelerator Keys),例如Ctrl+C和F8。通过Module1模块的代码示例,解释了如何使用GetMessage、TranslateAccelerator等函数来实现快捷键的响应,并指出这种技术适用于API创建菜单和动态改变菜单快捷键的情况。
684

被折叠的 条评论
为什么被折叠?



