【发布时间】:2009-06-02 06:24:32
【问题描述】:
有什么方法可以检测 NumLock 是否关闭以及如何在我的 VB APP 运行时自动重新打开它?
编辑: 我的应用程序是专用应用程序,在带有外部数字键盘设备的专用计算机上运行。
另一种选择是接受数字键盘箭头键(等)并将它们即时转换为数字,这可能吗? (例如,忽略 numlock 关闭的情况并表现得像 numlock 开启)
【问题讨论】:
有什么方法可以检测 NumLock 是否关闭以及如何在我的 VB APP 运行时自动重新打开它?
编辑: 我的应用程序是专用应用程序,在带有外部数字键盘设备的专用计算机上运行。
另一种选择是接受数字键盘箭头键(等)并将它们即时转换为数字,这可能吗? (例如,忽略 numlock 关闭的情况并表现得像 numlock 开启)
【问题讨论】:
我不确定您是如何在 vb.net 中专门执行此操作的(快速 google 发现 http://support.microsoft.com/kb/177674),但一般来说,像这样更改机器范围的设置是不受欢迎的:用户习惯于他们个人对 numlock 的偏好(或大写锁定 - 或其他)键状态......而你正在覆盖它。
这会真的激怒我。
也就是说,在您的应用是唯一运行的情况下(例如,POS 软件、医疗办公室管理软件等),这可能没问题。
【讨论】:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const KEYEVENTF_KEYUP = &H2
Const VK_NUMLOCK = &H90
Const KEYEVENTF_EXTENDEDKEY = &H1
Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal ByValnVirtKey As Integer) As Short
Private Sub numlockON()
keybd_event(VK_NUMLOCK, 0, 0, 0) ' Press NUMLOCK key down
keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0) ' Release it
End Sub
If Not GetKeyState(VK_NUMLOCK) Then numlockON()
【讨论】:
物理删除 NUMPAD 键?
【讨论】:
Public Const VK_NUMLOCK = &H90
Declare Function GetKeyState Lib "user32" Alias "GetKeyState" _
(ByVal ByValnVirtKey As Integer) As Short
Private Sub me_keyDown(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.NumLock And Not NLKey Then
If Not GetKeyState(VK_NUMLOCK) Then
e.Handled = True
NumlOn.Start()
Exit Sub
End If
End If
End sub
Private Sub NumlOn_Tick(sender As Object, e As EventArgs) Handles NumlOn.Tick
NLKey = True
If Not GetKeyState(VK_NUMLOCK) Then numlockON()
Application.DoEvents()
NumlOn.Stop()
NLKey = False
End Sub
【讨论】: