首页 电脑 电脑学堂 查看内容

按下某组键(HotKey)便执行某程式

2004-9-29 20:05 737 0

摘要: 在Dos的年代,我们常会以拦截中断向量的方式,做到按下某个hotkey而自动执行某个程式,在Window呢,也可以,不过它是用RegisterHotkey API来完成。使用Register...
关键词: nbsp Long ByVal hotkey hwnd RegisterHotkey Function 程式 idHotKey uVirtKey

在Dos的年代,我们常会以拦截中断向量的方式,做到按下某个hotkey而自动执行某个程式,在Window呢,也可以,不过它是用RegisterHotkey API来完成。使用RegisterHotkey的概念是,它会定义一组按键的组合,当使用者不管在哪个程式之中,按下Window有注册的HotKey时,OS会传送WM_HOTKEY 的讯息给待接收该讯息的Window,而该Window收到WM_HOTKEY时,便可知道有本身Thread所定义的HotKey被按下,於是可以从wParam, lParam来得知是哪一组HotKey被按下。RegisterHotKey(ByVal hwnd As Long , //接收Hotkey的WindowByVal idHotKey as Long, // identifier of hot key,range 0x0000 through 0xBFFFByVal Modifiers As Long, // 定义alt shift control等的组合ByVal uVirtKey As Long // virtual-key code)WM_HOTKEY 叁数的定义idHotKey = wParam; // identifier of hot key Modifiers = (UINT) LOWORD(lParam); // key-modifier flags uVirtKey = (UINT) HIWORD(lParam); // virtual-key code所以了,除了设定RegisterHotkey外,另要使用SubClassing的技巧才会得知HotKey被按下;最後,程式结束前要使用UnRegisterHotkey将HotKey的定义取消掉。以下程式功能是:不管在哪个程式中,只要按下ALT-SHIFT-G 便执行NotePad。'以下在.BasOption ExplicitDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongDeclare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _(ByVal hwnd As Long, ByVal nIndex As Long) As LongDeclare 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 LongDeclare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As LongDeclare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As LongPublic Const WM_HOTKEY = &H312Public Const MOD_ALT = &H1Public Const MOD_CONTROL = &H2Public Const MOD_SHIFT = &H4Public Const GWL_WNDPROC = (-4)Public preWinProc As LongPublic Modifiers As Long, uVirtKey As Long, idHotKey As LongPrivate Type taLongll As LongEnd TypePrivate Type t2IntlWord As Integerhword As IntegerEnd TypePublic Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _ByVal wParam As Long, ByVal lParam As Long) As LongIf Msg = WM_HOTKEY ThenIf wParam = idHotKey ThenDim lp As taLong, i2 As t2Intlp.ll = lParamLSet i2 = lpIf (i2.lWord = Modifiers) And i2.hword = uVirtKey ThenDebug.Print "HotKey Shift-Alt-G Pressed "Shell "notepad", vbNormalFocusEnd IfEnd IfEnd If'将之送往原来的Window Procedurewndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)End Function'以下在 FormSub Form_Load()Dim ret As LongpreWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)idHotKey = 1 'in the range &h0000 through &hBFFFModifiers = MOD_ALT + MOD_SHIFTuVirtKey = vbKeyGret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)End SubPrivate Sub Form_Unload(Cancel As Integer)Dim ret As Long'取消Message的截取,而使之又只送往原来的Window Procedureret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)Call UnregisterHotKey(Me.hwnd, uVirtKey)End Sub
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部