Vb.net 如何将ascii整数正确转换为相应的按键?
当我尝试将ASCII整数转换为包含多个字符的键时,总是会得到错误的结果。A->z/0->9工作正常,但任何具有多个字符的按键都会给出错误的结果,例如F1->F12/Numlock 0->Numlock 9/home键等 例如,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/其正确值 编辑、更新示例: 此代码用于需要在
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表示字符。您必须监控按键事件,并检查按下的键(我认为是),并与按键进行比较。collectionF3的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