专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »VB教程 » vb系统热键:VB 系统热键实现方法 »正文

vb系统热键:VB 系统热键实现方法

来源: 发布时间:星期四, 2008年9月25日 浏览:151次 评论:0

调用方法很简单,在Form中如下书写代码:

参考:[http://www.CrazyCoder.cn/]PrivateSubForm_Load()
SetHotkey
1,"Ctrl,112","Add"'按Ctrl+F1激活指定程序,F1的Ascii码为112
SetHotkey2,113,"Add"'按F2激活指定程序,F2的Ascii码为113
SetHotkey3,"Ctrl+Alt,113","Add"'按Ctrl+Alt+F2激活指定程序,F2的Ascii码为113
EndSub

PrivateSubForm_Unload(CancelAsInteger)
SetHotkey
1,"","Del"'退出程序是一定要用上的,不然会导至程序死掉
SetHotkey2,"","Del"
SetHotkey
3,"","Del"
EndSub

在项目中新建一个模块(bas文件),然后代码如下(此模块中需要我们修改的是Function keyWndproc(),这里的代码实现的是当系统中按了热键后的调用代码):

参考:[http://www.CrazyCoder.cn/]OptionExplicit
PrivateDeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong
PrivateDeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong)AsLong
PrivateDeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong
PrivateDeclareFunctionRegisterHotKeyLib"user32"(ByValhwndAsLong,ByValidAsLong,ByValfskey_ModifiersAsLong,ByValvkAsLong)AsLong
PrivateDeclareFunctionUnregisterHotKeyLib"user32"(ByValhwndAsLong,ByValidAsLong)AsLong

ConstWM_HOTKEY=&H312
ConstMOD_ALT=&H1
ConstMOD_CONTROL=&H2
ConstMOD_SHIFT=&H4
ConstGWL_WNDPROC=(-4)'窗口函数的地址

Dimkey_preWinProcAsLong'用来保存窗口信息
Dimkey_ModifiersAsLong,key_uVirtKeyAsLong,key_idHotKeyAsLong
Dimkey_IsWinAddressAsBoolean'是否取得窗口信息的判断


FunctionkeyWndproc(ByValhwndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong

IfMsg=WM_HOTKEYThen
SelectCasewParam'wParam值就是key_idHotKey
Case1'激活3个热键后,3个热键所对应的操作,大家在其他的程序中,只要修改此处就可以了
MsgBox"aa"
Case2
MsgBox"bb"
Case3
MsgBox"cc"
EndSelect
EndIf

'将消息传送给指定的窗口
keyWndproc=CallWindowProc(key_preWinProc,hwnd,Msg,wParam,lParam)

EndFunction

FunctionSetHotkey(ByValKeyIdAsLong,ByValKeyAss0AsString,ByValActionAsString)
DimKeyAss1AsLong
DimKeyAss2AsString
DimiAsLong

i
=InStr(1,KeyAss0,",")
Ifi=0Then
KeyAss1
=Val(KeyAss0)
KeyAss2
=""
Else
KeyAss1
=Right(KeyAss0,Len(KeyAss0)-i)
KeyAss2
=Left(KeyAss0,i-1)
EndIf

key_idHotKey
=0
key_Modifiers
=0
key_uVirtKey
=0

Ifkey_IsWinAddress=FalseThen'判断是否需要取得窗口信息,如果重复取得,再最后恢复窗口时,将会造成程序死掉
'记录原来的window程序地址
key_preWinProc=GetWindowLong(Form1.hwnd,GWL_WNDPROC)
'用自定义程序代替原来的window程序
SetWindowLongForm1.hwnd,GWL_WNDPROC,AddressOfkeyWndproc
EndIf

key_idHotKey
=KeyId
SelectCaseAction
Case"Add"
IfKeyAss2="Ctrl"Thenkey_Modifiers=MOD_CONTROL
IfKeyAss2="Alt"Thenkey_Modifiers=MOD_ALT
IfKeyAss2="Shift"Thenkey_Modifiers=MOD_SHIFT
IfKeyAss2="Ctrl+Alt"Thenkey_Modifiers=MOD_CONTROL+MOD_ALT
IfKeyAss2="Ctrl+Shift"Thenkey_Modifiers=MOD_CONTROL+MOD_SHIFT
IfKeyAss2="Ctrl+Alt+Shift"Thenkey_Modifiers=MOD_CONTROL+MOD_ALT+MOD_SHIFT
IfKeyAss2="Shift+Alt"Thenkey_Modifiers=MOD_SHIFT+MOD_ALT
key_uVirtKey
=Val(KeyAss1)
RegisterHotKeyForm1.hwnd,key_idHotKey,key_Modifiers,key_uVirtKey
'向窗口注册系统热键
key_IsWinAddress=True'不需要再取得窗口信息

Case"Del"
SetWindowLongForm1.hwnd,GWL_WNDPROC,key_preWinProc
'恢复窗口信息
UnregisterHotKeyForm1.hwnd,key_uVirtKey'取消系统热键
key_IsWinAddress=False'可以再次取得窗口信息
EndSelect
EndFunction

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: