微软的DirectInput是基于硬件底层,可以在窗口无焦点时捕捉按键,有兴趣可以去了解了解,在游戏制作方面很有用。
DirectX SDK 中文版,里面有关于DirectInput的介绍与用法。
Imports System.Runtime.InteropServices
Public Class Form1
Const WM_HOTKEY = &H312
Private keyid As Integer '热键识别ID
Protected Overrides Sub OnLoad(e As System.EventArgs)
MyBase.OnLoad(e)
REM:注册ATL+F12热键
If RegHotKey(ModKey.ALT, Keys.F12) Then MsgBox("热键已注册")
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
If UnHotKey() Then MsgBox("热键已卸载")
MyBase.OnFormClosed(e)
End Sub
'''
Private Function RegHotKey(fsmod As ModKey, vk As Keys) As Boolean
keyid = vk
Return Win32.NativeMethods.RegisterHotKey(Me.Handle, keyid, fsmod, vk)
End Function
'''
Private Function UnHotKey() As Boolean
Return Win32.NativeMethods.UnregisterHotKey(Me.Handle, keyid)
End Function
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
REM:如果热键已按下
If m.Msg = WM_HOTKEY AndAlso m.WParam =keyid Then
REM:如果窗体已最小化,显示默认大小的窗体
If Me.WindowState = FormWindowState.Minimized Then _
Me.WindowState = FormWindowState.Normal
REM:如果窗体已隐藏,显示窗体
If Not Me.Visible Then Me.Visible = True
End If
End Sub
'''
Enum ModKey
ALT = &H1
CTRL = &H2
SHIFT = &H4
End Enum
End Class
Namespace Win32
Public Class NativeMethods
'[return: MarshalAs(UnmanagedType.Bool)]
Public Shared Function RegisterHotKey(hwnd As IntPtr, _
id As Integer, _
fsModifiers As Integer, _
vk As Integer) As _
End Function
Public Shared Function UnregisterHotKey(hwnd As IntPtr, _
id As Integer) As _
End Function
End Class
End Namespace