Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何将ascii整数正确转换为相应的按键?_Vb.net_Ascii - Fatal编程技术网

Vb.net 如何将ascii整数正确转换为相应的按键?

Vb.net 如何将ascii整数正确转换为相应的按键?,vb.net,ascii,Vb.net,Ascii,当我尝试将ASCII整数转换为包含多个字符的键时,总是会得到错误的结果。A->z/0->9工作正常,但任何具有多个字符的按键都会给出错误的结果,例如F1->F12/Numlock 0->Numlock 9/home键等 例如,F3的ASCII码是114,但当我将114转换为字符时,它总是输出R,而不是F3 这与我尝试过的类似: (在本例中,它似乎没有用,但这并不是我将使用它的确切方式) 如何修复此问题,以便114/具有多个字符的任何其他键将输出为F3/其正确值 编辑、更新示例: 此代码用于需要在

当我尝试将ASCII整数转换为包含多个字符的键时,总是会得到错误的结果。A->z/0->9工作正常,但任何具有多个字符的按键都会给出错误的结果,例如F1->F12/Numlock 0->Numlock 9/home键等

例如,
F3
的ASCII码是
114
,但当我将
114
转换为字符时,它总是输出
R
,而不是
F3

这与我尝试过的类似:

(在本例中,它似乎没有用,但这并不是我将使用它的确切方式)

如何修复此问题,以便
114/具有多个字符的任何其他键
将输出为
F3/其正确值

编辑、更新示例:

此代码用于需要在应用程序外部工作的用户定义快捷方式,因此我使用
GetAsyncKeyState
确定按下了哪个ASCII整数,然后使用该ASCII整数进行绑定,但我还需要将该整数转换为字符(本例中为F3)因此,用户知道哪个键绑定当前处于活动状态

    Do
        ExitLoop = False

        For i = 0 To 255
            result = 0
            result = GetAsyncKeyState(i)
            If result = -32767 Then

                Dim c As Char = Chr(i)      ' Convert ASCII integer to char.
                Bind1.Text = c
                Shortcut1 = i
                ExitLoop = True

            End If
        Next i

    Loop While ExitLoop = False

这个标题有点误导人,因为它不是解决问题的正确方法。您可以使用它来告诉您索引根据其属性传递的键的状态。返回的值告诉我们当前是否按下了键。从MSDN页面

如果设置了最高有效位,则按键向下;如果设置了最低有效位,则按键在上一次调用GetAsyncKeyState后按下

由于返回值是a
UInt16
,我们希望查看最高有效位是否为1,因此我们将
使用0xFFFF(在VB和HFFFF中)计算结果

下面的程序将报告当前按下的所有键,并将它们放在一条消息中,并将该消息放在表单的标题栏中。创建一个新的WinForms项目,并粘贴此代码。您可能需要从设计器后面的代码中删除
Dispose
。功能
GetVKeyPressed
支持的按键数量有限,但您可以根据虚拟按键代码页制作所需的案例

Public Class Form1
    Implements IDisposable

    Declare Function GetAsyncKeyState Lib "User32" (ByVal vKey As Integer) As UInt16

    Private timer As New System.Threading.Timer(AddressOf timerCallback, Nothing, -1, -1)

    Private Function GetVKeyPressed(vKey As Integer) As String
        ' see https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
        Select Case vKey
            Case &H30 To &H39 ' 0 to 9
                Return Chr(vKey).ToString()
            Case &H41 To &H5A ' A to Z
                Return Chr(vKey).ToString()
            Case &H70 To &H87
                Return "F" & (vKey - &H70 + 1)
            Case &H1
                Return "LMB"
            Case &H2
                Return "RMB"
            Case Else
                Return "Key not supported yet!"
        End Select
    End Function

    Private Sub timerCallback(state As Object)
        Dim results As New Dictionary(Of Integer, UInt16)()
        For i = 0 To 255
            results.Add(i, GetAsyncKeyState(i))
        Next i
        Dim pressedKeys = String.Join(", ", results.
            Where(Function(kvp) kvp.Value And &HFFFF).
            Select(Function(kvp) GetVKeyPressed(kvp.Key)))
        Try
            Me.Invoke(Sub() Me.Text = pressedKeys)
        Catch ex As ObjectDisposedException
        End Try
        timer.Change(100, -1)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        timer.Change(100, -1)
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
        timer.Change(-1, -1)
    End Sub

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
                timer.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

End Class

114是
r
以及F3。是的,114也是小写r的
ASCII
代码。查看此图以查看按键代码的完整视图,或者您是在知道按键的位置后才知道的?因为在此基础上,您可以关联到
键。
类似于
键。F3
实际上是枚举中的114。另一种看待它的方式是F3不是字符。ASCII表示字符。您必须监控按键事件,并检查按下的键(我认为是),并与按键进行比较。collection
F3的ASCII码为114
否。114是“r”
我使用GetAsyncKeyState确定按下了哪个ASCII整数
它不是这样做的。这是您传递的内容,而不是ASCII代码。您可以看到,与虚拟键代码不匹配。我知道我晚了几个月,但我只想指出,所有
VK.*
虚拟键代码都映射到,因此可以将其用作
GetAsyncKeyState()
的参数类型,以简单起见。:)
Public Class Form1
    Implements IDisposable

    Declare Function GetAsyncKeyState Lib "User32" (ByVal vKey As Integer) As UInt16

    Private timer As New System.Threading.Timer(AddressOf timerCallback, Nothing, -1, -1)

    Private Function GetVKeyPressed(vKey As Integer) As String
        ' see https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
        Select Case vKey
            Case &H30 To &H39 ' 0 to 9
                Return Chr(vKey).ToString()
            Case &H41 To &H5A ' A to Z
                Return Chr(vKey).ToString()
            Case &H70 To &H87
                Return "F" & (vKey - &H70 + 1)
            Case &H1
                Return "LMB"
            Case &H2
                Return "RMB"
            Case Else
                Return "Key not supported yet!"
        End Select
    End Function

    Private Sub timerCallback(state As Object)
        Dim results As New Dictionary(Of Integer, UInt16)()
        For i = 0 To 255
            results.Add(i, GetAsyncKeyState(i))
        Next i
        Dim pressedKeys = String.Join(", ", results.
            Where(Function(kvp) kvp.Value And &HFFFF).
            Select(Function(kvp) GetVKeyPressed(kvp.Key)))
        Try
            Me.Invoke(Sub() Me.Text = pressedKeys)
        Catch ex As ObjectDisposedException
        End Try
        timer.Change(100, -1)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        timer.Change(100, -1)
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
        timer.Change(-1, -1)
    End Sub

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
                timer.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

End Class