简体   繁体   中英

Detect Print Screen keyup and keydown in Keyboard Tester app VB NET

I have a problem when I try to make Keyboard Tester application for my small office. I cant detect print screen keycode e.keycode = keys.PrintScreen.

I will do something like change picturebox back color when a key down, but it seems doesnt work with print screen, nothing happen.

my code is:

 Private Sub keyboardmenu_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    'Esc + Function Keys -----------------------------------------
    If e.KeyCode = Keys.Escape Then
        EscBox.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F1 Then
        F1Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F2 Then
        F2Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F3 Then
        F3Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F4 Then
        F4Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F5 Then
        F5Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F6 Then
        F6Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F7 Then
        F7Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F8 Then
        F8Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F9 Then
        F9Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F10 Then
        F10Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F11 Then
        F11Box.BackColor = Color.Red
    End If
    If e.KeyCode = Keys.F12 Then
        F12Box.BackColor = Color.Red
    End If
    'End of Esc + Function Keys -----------------------------------------


Private Sub keyboardmenu_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp

    'Esc + Function Keys ----------------------------------------

    If e.KeyCode = Keys.F1 Then
        F1Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F2 Then
        F2Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F3 Then
        F3Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F4 Then
        F4Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F5 Then
        F5Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F6 Then
        F6Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F7 Then
        F7Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F8 Then
        F8Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F9 Then
        F9Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F10 Then
        F10Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F11 Then
        F11Box.BackColor = Color.Transparent
    End If
    If e.KeyCode = Keys.F12 Then
        F12Box.BackColor = Color.Transparent
    End If
    'End of Esc + Function Keys -----------------------------------------

End Sub

Please help me. Idk if there are more keys like print screen problem.

Thank You

I'm not sure of the real reason, but I've read about it before and came to the conclusion that Windows is protecting that key's event from being easily handled. Someone else probably knows better, but this works:

Protected Overrides Function ProcessKeyEventArgs(ByRef msg As Message) As Boolean
    If msg.WParam = Keys.PrintScreen Then
        MessageBox.Show("PrintScreen key press detected!")
    End If

    Return MyBase.ProcessKeyEventArgs(msg)
End Function

Also, you should put all of those if statements in a Select Case statement:

Private Sub keyboardmenu_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles Me.KeyDown

    Select Case e.KeyCode
        Case Keys.Escape
            EscBox.BackColor = Color.Red
        Case Keys.F1
            F1Box.BackColor = Color.Red
        Case Keys.F2
            F2Box.BackColor = Color.Red
            'Etc
    End Select

End Sub

This comment is on the IF statements and CASE suggestion, otherwise I concur with the answer by Keith.

I use this sort of thing fairly often, but it's crazy to put all those IF statements, OR the Case statement: Simply name the boxes to match the enumeration, then (assuming Controls is the parent container of all the boxes)

Controls(e.keycode.tostring & "box").backcolor = Color.Red

and

Controls(e.keycode.tostring & "box").backcolor = Color.Transparent

This one line will replace everything (if you rename the escbox to escapebox)

Of course, you might want to do some checking like

If Controls.ContainsKey(e.keycode.tostring & "box") Then ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM