winforms 无法在VB.Net中检查Capslock是打开还是关闭

kx7yvsdv  于 2023-10-23  发布在  .NET
关注(0)|答案(2)|浏览(136)

我正在尝试编写代码来检查Capslock是否使用VB.net。我在网上找到了一些代码,但似乎有问题。这就是我迄今为止所尝试的。

If My.Computer.Keyboard.CapsLock = True Then
   Dim intmessage As Long
   intmessage = MsgBox("Would you like to exit the loop and close the application?", vbYesNo)
   If intmessage = vbYes Then Application.Exit()
End If
If Control.IsKeyLocked(Keys.CapsLock) = True Then
   Dim intmessage As Long
   intmessage = MsgBox("Would you like to exit the loop and close the application?", vbYesNo)
   If intmessage = vbYes Then Application.Exit()
End If

我有一长串的重复性任务,我想在我的电脑上运行。但我也希望有能力暂停这些任务与按下一个按钮。这个想法是,我将循环这些任务,定期检查Capslock,如果我想中断任务,我将使用它。随着循环的继续,如果我打开Capslock,我将可以选择暂停或退出循环。无论出于何种原因,这两次尝试都只是在应用程序启动时捕获Capslock的初始密钥状态。如果在我启动应用程序并开始循环时Capslock处于打开状态,则这些函数总是返回True。如果Capslock在我启动应用程序并开始循环时关闭,则这些始终返回False。这就像我需要刷新键盘控制或什么的。我需要的是开始时关闭Capslock,但在打开Capslock时要正确更新。
谢谢.

p4rjhz4m

p4rjhz4m1#

在窗体设计器的组件下添加计时器。将间隔设置为1000,并将enable设置为true。
然后添加此代码。

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Timer1.Stop()
    Static wasOn As Boolean = False
    If My.Computer.Keyboard.CapsLock Then
        If Not wasOn Then
            Dim dr As DialogResult
            dr = MessageBox.Show("Quit app?", "C A P T I O N", MessageBoxButtons.YesNo, MessageBoxIcon.Stop)
            If dr = Windows.Forms.DialogResult.Yes Then
                Me.Close()
            Else
                wasOn = True
            End If
        End If
    Else
        wasOn = False
    End If
    Timer1.Start()
End Sub

此代码强制CapsLock在再次提问前循环关闭/打开。注意MessageBox和DialogResult的使用。
编辑:

使用WndProc的另一种方法

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    CapsLockOn = My.Computer.Keyboard.CapsLock 'get initial state
End Sub

Private CapsLockOn As Boolean = False

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Select Case m.Msg
        Case WM_KEYDOWN
            Dim WParam As Integer = CInt(m.WParam)
            If WParam = _CAPITAL Then
                CapsLockOn = Not CapsLockOn 'toggle
            End If
    End Select
    MyBase.WndProc(m)
End Sub

Private Shared ReadOnly WM_KEYDOWN As Integer = &H100 'The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.
Private Shared ReadOnly _CAPITAL As Integer = &H14   ' CAPS LOCK key

然后在代码中周期性地调用this,

Private Sub ChkCapsLock()
    If CapsLockOn Then
        Dim dr As DialogResult
        dr = MessageBox.Show("Quit app?", "C A P T I O N", MessageBoxButtons.YesNo, MessageBoxIcon.Stop)
        If dr = Windows.Forms.DialogResult.Yes Then
            If Me.InvokeRequired Then
                Me.BeginInvoke(Sub()
                                   Me.Close()
                               End Sub)
            Else
                Me.Close()
            End If
        End If
    End If
End Sub
  • 但是 * -如果你有UI锁定这也不会工作。
db2dz4w8

db2dz4w82#

我从来没有真正解决过这个问题。然而,我想出了一个变通办法,这是实际的我的情况。这可能不适用于所有人,但有几种方法可以使用类似的策略。
我经常使用MySQL。因此,我设置了一个表(tblStop),它只包含一行,在该行中,它在onoff列中包含1或0。现在,我设置了循环来检查并查看在每次迭代后哪个数字保存在那里。我让它在0时断裂,就像我打算让它在capslockon时断裂一样。
我创建了两个非常简单的应用程序,一个名为ON,另一个名为OFF。这些选项可适当地打开或关闭tblStop。然后我把它们钉在我的腰带上,这样我就可以很容易地把它们挂起来。

相关问题