vb系统热键:VB 系统热键实现方法来源: 发布时间:星期四, 2008年9月25日 浏览:151次 评论:0
调用方法很简单,在Form中如下书写代码: 参考:[http://www.CrazyCoder.cn/]PrivateSubForm_Load()
SetHotkey1,"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) SetHotkey1,"","Del"'退出程序是一定要用上的,不然会导至程序死掉 SetHotkey2,"","Del" SetHotkey3,"","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
相关文章
读者评论
发表评论 |