请问最新版VB net中如何在窗口隐藏或失焦的情况下捕捉到键盘按下事件?

2025-02-26 07:21:44
推荐回答(2个)
回答1:

微软的DirectInput是基于硬件底层,可以在窗口无焦点时捕捉按键,有兴趣可以去了解了解,在游戏制作方面很有用。

DirectX SDK 中文版,里面有关于DirectInput的介绍与用法。


回答2:

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 _
Boolean
End Function

_
Public Shared Function UnregisterHotKey(hwnd As IntPtr, _
id As Integer) As _
Boolean
End Function

End Class
End Namespace