키보드 입력을 사용하여 데이터를 보내는 자기 카드 판독기가 있습니다. 내가이 개체를 얻을 KeyDown 이벤트 (C# WPF) 사용하고 있습니다 : 내가 얻을 열쇠를 가지고 그 하나의 문자열 만들기 위해Concat KeyDown 이벤트 (키)를 하나의 C# (wpf) 문자열
KeyEventArgs e
내가 원하는합니다. e.Key.ToString()
의 연결을 시도했지만 작동하지 않습니다. 내 입력에는 숫자와 기호 (예 :; = 등)가 많이 있고 e.Key.ToString()이 작동하지 않습니다 (숫자로 D3을, Shift 또는 Ctrl + 다른 키에서 표지판).
난 그냥 문자열을 원하는, 그래서 예를 Console.WriteLine을 사용할 때 나는
;51895401051=000001341?
하지
Oem1SHIFTD1CNTRLD2D3D2D1SHIFTD9OemQuestion ....
같은 것을 얻을 것이다 나는 KeyConverter를 사용하여 시도하지만 그림에 없습니다 이거.
누군가 나를 도울 수 있습니까?
내 현재의 이벤트 핸들러는 (제대로 작동하지 않는)입니다 : TypedText 내가 키를 CONCAT 할 문자열입니다
public static void keyPress(Object sender, KeyEventArgs e)
{
string keyCodeString = e.Key.ToString();
char? key = null;
if (keyCodeString.Length == 1)
{
key = keyCodeString[0];
}
else
{
if (keyCodeString.StartsWith("NumPad"))
{
key = keyCodeString[keyCodeString.Length - 1];
}
else if (keyCodeString.StartsWith("D"))
key = keyCodeString[keyCodeString.Length - 1];
}
TypedText += key;
}
. 출력 결과는 위에서 설명했다.
직접 해결했습니다. 여기에 답이 있습니다. 아래의 GetCharFromKey
기능은 (당신이 e.Key를 보내야합니다) 키를 가져오고 문자 반환
public enum MapType : uint
{
MAPVK_VK_TO_VSC = 0x0,
MAPVK_VSC_TO_VK = 0x1,
MAPVK_VK_TO_CHAR = 0x2,
MAPVK_VSC_TO_VK_EX = 0x3,
}
[DllImport("user32.dll")]
public static extern bool GetKeyboardState(byte[] lpKeyState);
[DllImport("user32.dll")]
public static extern uint MapVirtualKey(uint uCode, MapType uMapType);
[DllImport("user32.dll")]
public static extern int ToUnicode(
uint wVirtKey,
uint wScanCode,
byte[] lpKeyState,
[Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)]
StringBuilder pwszBuff,
int cchBuff,
uint wFlags);
public static char GetCharFromKey(Key key)
{
char ch = ' ';
int virtualKey = KeyInterop.VirtualKeyFromKey(key);
byte[] keyboardState = new byte[256];
GetKeyboardState(keyboardState);
uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
StringBuilder stringBuilder = new StringBuilder(2);
int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0);
switch (result)
{
case -1:
break;
case 0:
break;
case 1:
{
ch = stringBuilder[0];
break;
}
default:
{
ch = stringBuilder[0];
break;
}
}
return ch;
}
당신은 키보드 에뮬레이터로 카드 리더기를 사용합니다. 사용할 수있는 SDK가 있습니까? 일반적으로 이러한 장치에는 응용 프로그램에서 사용할 수있는 드라이버 및 컨트롤/API가 함께 제공됩니다. – StaWho
그냥 키보드 입력입니다. 사실 카드 리더기이거나 키보드에 부딪히는 좀비 혼란이이 경우에는 중요하지 않습니다. – Programer
사용할 수있는 다른 이벤트가 있습니까? – raznagul