.NET按键关闭事件[按键组合不工作]

.NET按键关闭事件[按键组合不工作],.net,vb.net,events,key,keydown,.net,Vb.net,Events,Key,Keydown,我是个编程新手。目前存在按键组合问题 [LWin+L] Private Sub unit_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown If (e.KeyCode = Keys.L AndAlso e.KeyCode = Keys.LWin) Then MsgBox("Pressed!") End If End Sub If (e.KeyCode = Keys.L AndAlso

我是个编程新手。目前存在按键组合问题

[LWin+L]

Private Sub unit_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If (e.KeyCode = Keys.L AndAlso e.KeyCode = Keys.LWin) Then
        MsgBox("Pressed!")
    End If
End Sub
If (e.KeyCode = Keys.L AndAlso e.Modifiers = Keys.Control) Then
消息框不显示。已尝试使用KeyUp、PreviewKeyDown,但无效

但是,它可以与其他组合一起使用,例如 [Ctrl+L]

Private Sub unit_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If (e.KeyCode = Keys.L AndAlso e.KeyCode = Keys.LWin) Then
        MsgBox("Pressed!")
    End If
End Sub
If (e.KeyCode = Keys.L AndAlso e.Modifiers = Keys.Control) Then
在这里呆了半天。希望一些专业人士能提供解决方案


谢谢

作为
键。LWin
从技术上讲不是一个修改键,您必须使用变通方法来解决这个问题

这里有一个相当简单的例子:

  • 每次按下一个键时,将其添加到表格中

  • 检查我们的表中是否存在所需的组合键,如果存在,则在按下该组合键时执行您想要执行的操作

  • 释放密钥后,将其从表中删除

像这样的方法应该会奏效:

'This is our table containing all currently pressed keys.
Private KeysPressed As New HashSet(Of Keys)

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    'Add the currently pressed key to the table.
    KeysPressed.Add(e.KeyCode)

    'Determine if the combination LWin + L exists in our table (thus, if it is currently pressed)
    If KeysPressed.Contains(Keys.LWin) AndAlso KeysPressed.Contains(Keys.L) Then
        'Clear all pressed keys to avoid possible issues.
        KeysPressed.Clear()

        'Do your stuff here...
    End If
End Sub

Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    'Remove the released key from the table.
    KeysPressed.Remove(e.KeyCode)
End Sub

您可能应该使用LWin+L以外的其他组合键,因为Windows似乎不会将其发送到您的应用程序,因为它也是锁定计算机的快捷方式。

作为
键。LWin
从技术上讲不是修改键,您必须使用变通方法来解决此问题

这里有一个相当简单的例子:

  • 每次按下一个键时,将其添加到表格中

  • 检查我们的表中是否存在所需的组合键,如果存在,则在按下该组合键时执行您想要执行的操作

  • 释放密钥后,将其从表中删除

像这样的方法应该会奏效:

'This is our table containing all currently pressed keys.
Private KeysPressed As New HashSet(Of Keys)

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    'Add the currently pressed key to the table.
    KeysPressed.Add(e.KeyCode)

    'Determine if the combination LWin + L exists in our table (thus, if it is currently pressed)
    If KeysPressed.Contains(Keys.LWin) AndAlso KeysPressed.Contains(Keys.L) Then
        'Clear all pressed keys to avoid possible issues.
        KeysPressed.Clear()

        'Do your stuff here...
    End If
End Sub

Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    'Remove the released key from the table.
    KeysPressed.Remove(e.KeyCode)
End Sub

您可能应该使用LWin+L以外的其他组合键,因为Windows似乎不会将其发送到您的应用程序,因为这也是锁定计算机的快捷方式。

嗨,Vincent,谢谢您的快速响应。我试过你的方法,它直接跳到锁屏。但是,如果只按一个键,它就可以工作。如果按了Keys.Contains(Keys.LWin),然后“做你的事情…”。。。终点If@Tim:嗯,是的。Windows的内置快捷键之一是
Win+L
,用于锁定计算机。您无法通过这样的代码来克服这一点。如果可能的话,你应该使用另一种组合,而不是
LWin+L
@Tim:我刚刚用一个代码修复程序更新了我的答案除了
LWin+L
之外的任何其他组合似乎都有效(例如
LWin+K
),因此Windows似乎没有将
LWin+L
组合发送到您的应用程序,因为它是一个保留的快捷方式。否则它对我有用@蒂姆:如果我的答案解决了你的问题,请按我帖子左边的复选标记,将其标记为已接受有关更多信息,请参阅:@Vincent UPDATE:Find Alternative For LWin+L。谢谢Vincent,感谢您的快速回复。我试过你的方法,它直接跳到锁屏。但是,如果只按一个键,它就可以工作。如果按了Keys.Contains(Keys.LWin),然后“做你的事情…”。。。终点If@Tim:嗯,是的。Windows的内置快捷键之一是
Win+L
,用于锁定计算机。您无法通过这样的代码来克服这一点。如果可能的话,你应该使用另一种组合,而不是
LWin+L
@Tim:我刚刚用一个代码修复程序更新了我的答案除了
LWin+L
之外的任何其他组合似乎都有效(例如
LWin+K
),因此Windows似乎没有将
LWin+L
组合发送到您的应用程序,因为它是一个保留的快捷方式。否则它对我有用@蒂姆:如果我的答案解决了你的问题,请按我帖子左边的复选标记,将其标记为已接受有关详细信息,请参阅:@Vincent UPDATE:Find Alternative For LWin+L。ThanksA keycode不能同时为L和Win+L。Win+L将首先锁定工作站。@HansPassant希望应用程序在用户锁定屏幕时执行该操作。我可以在PC上进行任何设置以使其正常工作吗?(比如锁屏延时1秒?)谢谢@HansPassant更新:找到LWin+L的替代方案。谢谢。ThanksA keycode不能同时为L和Win+L。您永远不会得到它,Win+L会先锁定工作站。@HansPassant希望应用程序在用户锁定屏幕时执行该操作。我可以在PC上进行任何设置以使其正常工作吗?(比如锁屏延时1秒?)谢谢@HansPassant更新:找到LWin+L的替代方案。谢谢。谢谢