我正在制作自己的"写字板"类型的东西,我已经成功地用文本框以通常的方式完成了它,但现在我正在尝试使用"UserActivityHooks.cs"程序。我遇到的问题是,当他们按下空格键时,它会打印:HiSpaceMom而不是:Hi Mom。有没有办法过滤掉它?我尝试使用它:
UserActivityHook hook;
string log = string.Empty;
public Form1()
{
InitializeComponent();
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
hook = new UserActivityHook();
hook.KeyUp += (s, e) =>
{
log += e.KeyData.ToString();
if (log == "Space")
{
log = " ";
}
textLogs.Text = log;
};
但这种方法仅在"空间"单独出现时才有效,而不是在任何其他字符旁边。谁能帮忙?源代码在这里:http://code.google.com/p/wikipedia-aloud-reader/source/browse/trunk/WikiReader/UserActivityHook.cs?r=4
根据您上面提供的代码,发生这种情况的原因是您正在检查日志是否与"Space"
相等,而不是e.KeyData
对象。因此,鉴于您一直在构建日志,如果遇到的第一个字符是空格,那么log == "Space"
唯一正确的方法是第一次。从那以后,log == "Space"
永远不会也永远不会是真的。(除非用户实际输入了字符"空格",但这不是您想要转换的内容 - 更改设计的进一步原因。
此外,您在检查之前将KeyData
字符串添加到日志中,因此即使您修复了条件,这也不会按原样工作。
关于解决此问题可以执行的操作的两点:
-
检查是否
e.KeyData.ToString() == Space
,而不是log
。 -
如果要构建长日志,则日志字符串会遇到性能问题。您应该改用
StringBuilder
,将每个字符附加到其中,并在需要使用或编写它时将其转换为string
。就目前而言,每次向其添加字符时,您最终都会创建一个全新的字符串。
因此,此代码的修正版本可能如下所示:
// log is defined above as a StringBuilder
hook.KeyUp += (s, e) =>
{
if (e.KeyData.ToString() == "Space")
{
log.Append(" ");
}
else
{
log.Append(e.KeyData.ToString());
}
textLogs.Text = log.ToString();
};
最后一件事 - 虽然这应该允许你的实现做你想要做的事情,但它的工作方式存在一些非常严重的缺陷。如果用户想要删除他们刚刚编写的单词,或者想要更改他们在 50 个字符前编写的单词,会发生什么情况?就目前而言,您已经制作了一个看起来完全可用的键盘记录器,但是我不确定您打算如何允许用户执行任何操作,只能编写一个拼写完美的字符串/格式的字符串,之后他们无法进行任何编辑。(另外 - 如果他们按Control
、Shift
或Alt
会发生什么?你在其他地方处理吗?