2017-03-24 6 views
1

ASCII 정수를 두 개 이상의 문자가있는 키로 변환하려고하면 항상 잘못된 결과가 나타납니다. A -> z/0 -> 9는 올바르게 작동하지만 두 개 이상의 문자가있는 키 누르기는 항상 F1 -> F12/Numlock 0 -> Numlock 9/home 키 등의 잘못된 결과를 나타냅니다.아스키 정수를 해당 키 누르기로 올바르게 변환하려면 어떻게해야합니까?

예 , F3에 대한 ASCII 코드는 114하지만 난이 문자로 114를 변환 할 때 항상이 내가 시도 것과 유사한 무언가 R 대신

F3의 출력 :

(그것은이 예에서 쓸모없는 것 같다,하지만이 ISN 내가 정확히 어떻게 사용하는지)

Dim bind = "114" '(F3) depending on user input 
Dim c As Char = bind 'Convert the ASCII integer(bind) to character(c) 
TextBox1.text = c 'which in this case outputs as "r" 

114/any other key that has more than one characterF3/their correct value으로 출력되도록 어떻게 수정해야합니까?

편집, 업데이트 예 :

난 다음에 그 ASCII 정수를 사용하여, 눌러 진 ASCII 정수 결정 GetAsyncKeyState를 사용하던 응용 프로그램 밖에서 일해야하는 사용자 정의 단축키, 그래서이 코드 bind하지만이 정수를 문자 (이 경우 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 
+2

_114_는 r' [I 믿어 (http://www.theasciicode.com.ar/ascii-printable-characters/lowercase-letter-r-minuscule-ascii-code-114.html) '이고 F3이기도합니다. – Bugs

+1

네, 114는 소문자 r에 대한'ASCII' 코드입니다. 키 코드의 전체보기는이 이미지를 참조하십시오. https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/ASCII-Table-wide.svg/1280px-ASCII-Table-wide.svg.png – David

+0

당신은 그들이 114를 입력 할 수 있다고 말하고 그 캐릭터가 무엇인지 알고 싶습니까? F3 키에서 같은 논리를 사용합니까? 그들은 F3 키와 동일한 숫자를 입력 했습니까? – Bugs

답변

1

제목이 약간의 오해의 소지가 있습니다. 문제를 해결하는 올바른 방법이 아니기 때문입니다. GetAsyncKeyStateVirtual-Key Code에 따라 색인으로 전달 된 키의 상태를 알려줍니다. 반환 된 값은 키가 현재 눌려져 있는지 알려줍니다. MSDN 페이지에서

가장 중요한 비트가 설정되면 키가 작동하지 않으며, 최하위 비트가 설정된 경우 GetAsyncKeyState를 이전에 호출 한 후에 키를 누를 수 있습니다.

반환 값이 UInt16이며, 우리는 최상위 비트가 1이면, 우리가 0xFFFF가와 결과를 And 것보고 싶어하기 때문에 (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 
+0

나는 몇 달 전에 너무 늦었다 고 알고있다. 그러나 나는 모든 가상 키 코드가 [**'System.Windows.Forms.Keys' 열거 **] (https : //msdn.microsoft.com/en-us/library/system.windows.forms.keys (v = vs.110) .aspx), 간단하게하기 위해'GetAsyncKeyState()'의 매개 변수 유형으로 사용할 수 있습니다 . :) –