VB作的挂中加入热键

      在vb作的挂中加入热键,本文提供了一个简便的解决办法。
 
      一、问题的提出
      从 DOS 时代开始写程序的同学,对于热键的功能应该不陌生,在 DOS
      时代我们往往会撰写系统常驻程序借进行热键盘的操作,随时检测用户的按键盘情况,然后根据所按的按键盘决定执行的程序。
      现在到了 Windows 的时代,键盘的中断已经交由 Windows 统一管理,因此程序无法再拦载"键盘的中断",那么在 Windows
     中如何实现热键盘的操作呢?
      二、问题的解决
      方法(1):通过 API 函数 GetAsyncKeyState(判断函数调用时指定虚拟键的状态)、和 Timer(时间控件),来实现热键的操作
      例子:用热键 F2 调用 MsgBox。
       Private  Declare  Function  GetAsyncKeyState Lib  " user32 "  (ByVal vkey  As  
      
Long As   Integer
      
Private   Sub  Form_Load()
      Timer1.Interval 
=   1    注释:设置检测间隔时间
      
End Sub
      
Private   Sub  Timer1_Timer()
      
If  MyHotKey(vbKeyF2)  Then   MsgBox   " 热键调用成功!! " , vbOKOnly
      
End Sub
      小结:用这个方法只需要调用一个 API 函数,比较简单,但是由于使用的是 Timer
      控件来实现按键的监视,如果监视间隔时间过短,就会造成系统资源的浪费;如果间隔时间过长,按键就可能漏掉。
      方法(2):通过 API 函数 RegisterHotKey(向系统注册相应的热键)、WndProc(消息处理)等等,来实现热键的操作。
      例子:由于代码太多,请大家查看软件报 2000 年 第 48 期的文章<<再谈热键编程>>
      小结:这种方法需要调用调用 6 个以上的 API
      函数,需要定义多个常数(操作一个热键就要定义一个常数),对于一般的编程爱好者来说,过于复杂,不好掌握。
      方法(3):通过调用 VC 编写的 DLL 文件。
      由于 Windows 规定用以拦截全系统键盘消息的 HookProc Callback 函数必须放在 DLL 文件里面,但 VB 无法制作 DLL
      文件(注:VB 可以用来制作 ActiveX DLL 文件,但 ActiveX DLL 与单纯的 DLL 不尽相同)。
      我们这里调用王国荣先生用 VC 编写的 KeybHook.dll 文件(注:现在许多的有关热键操作的软件都是调用的这个 dll
      文件,大家如果需要可到 。
      例子:按键追踪程序(可以检测你按下的所有的键值)
      Fomr1.frm 文件代码:
      
Option   Explicit
      
Private   Sub Form_Load()
          
On Error Resume Next
          注释:挂上 KeyboardHook_HookProc 函数
          SetKeyboardHook 
Me.hWnd, WM_USER
          
If Err.Number <> 0 Then
              
MsgBox "请先将 KeybHook.dll 复制到 Windows 的所在路径!", vbCritical
              
End
          
End If
          
On Error GoTo 0
          注释:挂上窗口程序
          prevWndProc 
= GetWindowLong(Me.hWnd, GWL_WNDPROC)
          SetWindowLong 
Me.hWnd, GWL_WNDPROC, AddressOf WndProc
      
End Sub
 
      
Private   Sub Form_Unload(Cancel As Integer)
          注释:卸下 KeyboardHook_HookProc 函数
          ReleaseKeyboardHook
          注释:卸下窗口程序
          SetWindowLong 
Me.hWnd, GWL_WNDPROC, prevWndProc
      
End Sub

      Module1.bas 文件代码:
      
Option   Explicit
      
Public   Const  GWL_WNDPROC  =  ( - 4 )
      
Public   Const  WM_USER  =   & H400
      
Declare   Function CallWindowProc Lib "user32" Alias "CallWindowProcA" 
      (
ByVal lpPrevWndFunc As LongByVal hWnd As LongByVal Msg As LongByVal 
      wParam 
As LongByVal lParam As LongAs Long
      
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal 
      hWnd 
As LongByVal nIndex As LongAs Long
      
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal 
      hWnd 
As LongByVal nIndex As LongByVal dwNewLong As LongAs Long
      
Declare Function SetKeyboardHook Lib "KeybHook" (ByVal hwndPost As Long
      
ByVal Msg As LongAs Long
      
Declare Function ReleaseKeyboardHook Lib "KeybHook" () As Long
      
Public prevWndProc As Long
      
Dim IsCtrlDown As Boolean
      
Function WndProc(ByVal hWnd As LongByVal Msg As LongByVal wParam As 
      
LongByVal lParam As LongAs Long
          
If Msg = WM_USER Then
              Form1.List1.AddItem 
"wParam=" & wParam & ", lParam=" & Hex(lParam)
              Form1.List1.ListIndex 
= Form1.List1.NewIndex
              
If wParam = 65 And (lParam And &H80000000) <> 0 Then MsgBox 
      
"热键调用成功!!", vbOKOnly
              注释:判断按键情况,对于你所按的按键的键值可通过本程序查看到
           
If wParam = 66 And (lParam And &H80000000) <> 0 And IsCtrlDown Then 
      
MsgBox  "组合热键调用成功!!", vbOKOnly, "组合键情况"
              注释:判断按键情况(组合键情况)
          
End If
          WndProc 
= CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
      
End Function
     
     小结:用这种方法,就我而言感觉是最好的,可以很方便的检测按键,不需要事先用常量定义,不需要时间控件,也可方便的定义组合键。

      以上程序在 VB6.0、Windows XP下调试通过。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VB.NET注册多个热键,可以使用Windows API函数来实现。以下是一个示例代码,说明如何在VB.NET注册多个热键: 首先,导入系统的用户界面库: Imports System.Runtime.InteropServices 然后,定义一些常量和API函数: Public Class Form1 ' 定义常量 Private Const MOD_CONTROL As Integer = &H2 Private Const WM_HOTKEY As Integer = &H312 ' 导入Windows API函数 <DllImport("user32.dll")> _ Private Shared Function RegisterHotKey(ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean End Function <DllImport("user32.dll")> _ Private Shared Function UnregisterHotKey(ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean End Function 接下来,在窗体加载事件注册热键: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 注册热键 RegisterHotKey(Me.Handle, 1, MOD_CONTROL, Keys.A) RegisterHotKey(Me.Handle, 2, MOD_CONTROL, Keys.B) End Sub 接着,在窗体消息处理事件处理热键消息: Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = WM_HOTKEY Then Dim hotkeyId As Integer = m.WParam.ToInt32() Select Case hotkeyId Case 1 ' 处理热键1的逻辑 MessageBox.Show("热键1被触发") Case 2 ' 处理热键2的逻辑 MessageBox.Show("热键2被触发") End Select End If MyBase.WndProc(m) End Sub 最后,在窗体关闭事件取消注册热键: Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing ' 取消注册热键 UnregisterHotKey(Me.Handle, 1) UnregisterHotKey(Me.Handle, 2) End Sub 以上代码演示了如何在VB.NET注册多个热键,并在热键被触发时处理相应的逻辑。你可以根据需要修改和扩展这个示例代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值