用API函数定义热键又一法
2006-02-27 11:51:35 来源:WEB开发网核心提示:土人的拙作《如何用API函数定义热键》在VB编程乐园发表后,很多网友纷纷来信,用API函数定义热键又一法,有的指出其中存在的问题并提出解决方的案(土人在此表示感谢!);有的则询问可不可以定义组合键等问题,土人不才,按下Ctrl F12窗体弹出来,本例仅需要一个窗体,通过多方查找资料,才找到另一种定义热键的方法
土人的拙作《如何用API函数定义热键》在VB编程乐园发表后,很多网友纷纷来信,有的指出其中存在的问题并提出解决方的案(土人在此表示感谢!);有的则询问可不可以定义组合键等问题。土人不才,通过多方查找资料,才找到另一种定义热键的方法,在此把心得写出来,请各位网友指正!
三个API函数是必须的:
RegisterHotKey——用于定义热键
UnregisterHotKey——用于注销热键
PeekMessage——用于检测热键(尚有其它的主要用途)
这里举个实例:程序启动后窗体不可见,按下Ctrl F12窗体弹出来。本例仅需要一个窗体,在PWin98、VB6.0企业版下调试通过。
'申明API函数
PRivateDeclareFunctionRegisterHotKeyLib"user32"(ByValhWndAsLong,ByValidAsLong,ByValfsModifiersAsLong,ByValvkAsLong)AsLong
PrivateDeclareFunctionUnregisterHotKeyLib"user32"(ByValhWndAsLong,ByValidAsLong)AsLong
PrivateDeclareFunctionPeekMessageLib"user32"Alias"PeekMessageA"(lpMsgAsMsg,ByValhWndAsLong,ByValwMsgFilterMinAsLong,ByValwMsgFilterMaxAsLong,ByValwRemoveMsgAsLong)AsLong
PrivatebCancelAsBoolean'用于热键有效与否的变量
'全局变量
PrivateConstMOD_ALT=&H1
PrivateConstMOD_CONTROL=&H2
PrivateConstMOD_SHIFT=&H4
PrivateConstPM_REMOVE=&H1
PrivateConstWM_HOTKEY=&H312
PrivateTypeMsg'定义Message类型
hWndAsLong
MessageAsLong
wParamAsLong
lParamAsLong
timeAsLong
EndType
PrivateSubproMsg()'声明进程
DimMessageAsMsg
'循环直到bCancel为真
DoWhileNotbCancel
'检测到热键被按下则令窗体隐藏
IfPeekMessage(Message,Me.hWnd,WM_HOTKEY,WM_HOTKEY,PM_REMOVE)Then
Me.Visible=True
EndIf
DoEvents
Loop
EndSub
PrivateSubForm_Load()'窗体加载时初始化程序
DimretAsLong
bCancel=False
'定义热键为Ctrl F12
ret=RegisterHotKey(Me.hWnd,&HBFFF&,MOD_CONTROL,vbKeyF12)
Me.Visible=False'窗体不可见
proMsg
EndSub
'退出时注销热键
PrivateSubForm_Unload(CancelAsInteger)
bCancel=True
CallUnregisterHotKey(Me.hWnd,&HBFFF&)
EndSub->
三个API函数是必须的:
RegisterHotKey——用于定义热键
UnregisterHotKey——用于注销热键
PeekMessage——用于检测热键(尚有其它的主要用途)
这里举个实例:程序启动后窗体不可见,按下Ctrl F12窗体弹出来。本例仅需要一个窗体,在PWin98、VB6.0企业版下调试通过。
'申明API函数
PRivateDeclareFunctionRegisterHotKeyLib"user32"(ByValhWndAsLong,ByValidAsLong,ByValfsModifiersAsLong,ByValvkAsLong)AsLong
PrivateDeclareFunctionUnregisterHotKeyLib"user32"(ByValhWndAsLong,ByValidAsLong)AsLong
PrivateDeclareFunctionPeekMessageLib"user32"Alias"PeekMessageA"(lpMsgAsMsg,ByValhWndAsLong,ByValwMsgFilterMinAsLong,ByValwMsgFilterMaxAsLong,ByValwRemoveMsgAsLong)AsLong
PrivatebCancelAsBoolean'用于热键有效与否的变量
'全局变量
PrivateConstMOD_ALT=&H1
PrivateConstMOD_CONTROL=&H2
PrivateConstMOD_SHIFT=&H4
PrivateConstPM_REMOVE=&H1
PrivateConstWM_HOTKEY=&H312
PrivateTypeMsg'定义Message类型
hWndAsLong
MessageAsLong
wParamAsLong
lParamAsLong
timeAsLong
EndType
PrivateSubproMsg()'声明进程
DimMessageAsMsg
'循环直到bCancel为真
DoWhileNotbCancel
'检测到热键被按下则令窗体隐藏
IfPeekMessage(Message,Me.hWnd,WM_HOTKEY,WM_HOTKEY,PM_REMOVE)Then
Me.Visible=True
EndIf
DoEvents
Loop
EndSub
PrivateSubForm_Load()'窗体加载时初始化程序
DimretAsLong
bCancel=False
'定义热键为Ctrl F12
ret=RegisterHotKey(Me.hWnd,&HBFFF&,MOD_CONTROL,vbKeyF12)
Me.Visible=False'窗体不可见
proMsg
EndSub
'退出时注销热键
PrivateSubForm_Unload(CancelAsInteger)
bCancel=True
CallUnregisterHotKey(Me.hWnd,&HBFFF&)
EndSub->
更多精彩
赞助商链接