【问题标题】:detect if NumLock is OFF and turn it always back ON检测 NumLock 是否关闭并将其始终重新打开
【发布时间】:2009-06-02 06:24:32
【问题描述】:

有什么方法可以检测 NumLock 是否关闭以及如何在我的 VB APP 运行时自动重新打开它?

编辑: 我的应用程序是专用应用程序,在带有外部数字键盘设备的专用计算机上运行。

另一种选择是接受数字键盘箭头键(等)并将它们即时转换为数字,这可能吗? (例如,忽略 numlock 关闭的情况并表现得像 numlock 开启)

【问题讨论】:

    标签: vb.net input keyboard


    【解决方案1】:

    我不确定您是如何在 vb.net 中专门执行此操作的(快速 google 发现 http://support.microsoft.com/kb/177674),但一般来说,像这样更改机器范围的设置是不受欢迎的:用户习惯于他们个人对 numlock 的偏好(或大写锁定 - 或其他)键状态......而你正在覆盖它。

    这会真的激怒我。

    也就是说,在您的应用是唯一运行的情况下(例如,POS 软件、医疗办公室管理软件等),这可能没问题。

    【讨论】:

    • 不能更同意刺激因素。 @OP:请不要这样做,除非您的应用完全和独占控制机器。
    • 这是专用机器中的专用应用程序。它将有一个独特的外部 NUMPAD 作为唯一的键盘,如果用户错误地单击 numlock 将是灾难......有什么想法吗?
    • 处理带有+而不带数字锁的键码。所以,开不开都没关系。
    • 这在您的应用程序是唯一运行的情况下很有用(例如,POS 软件、医疗办公室管理软件等)
    【解决方案2】:
        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()
    

    【讨论】:

      【解决方案3】:

      物理删除 NUMPAD 键?

      【讨论】:

      • 我在工作时需要在我的数字锁定键上安装某种电击装置,所以当我的老板使用我的电脑做某事时,他会,嗯,提醒不要关闭它。 :) (我一直告诉他,只有一两英寸远的地方有完全可用的箭头键,没有必要盗用我的数字键,但他不相信我。)
      【解决方案4】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多