C# 筛选出用户活动挂钩中的"Space"键.cs

  • 本文关键字:Space cs 筛选 用户 活动 c#
  • 更新时间 :
  • 英文 :


我正在制作自己的"写字板"类型的东西,我已经成功地用文本框以通常的方式完成了它,但现在我正在尝试使用"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字符串添加到日志中,因此即使您修复了条件,这也不会按原样工作。

关于解决此问题可以执行的操作的两点:

  1. 检查是否e.KeyData.ToString() == Space,而不是log

  2. 如果要构建长日志,则日志字符串会遇到性能问题。您应该改用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 个字符前编写的单词,会发生什么情况?就目前而言,您已经制作了一个看起来完全可用的键盘记录器,但是我不确定您打算如何允许用户执行任何操作,只能编写一个拼写完美的字符串/格式的字符串,之后他们无法进行任何编辑。(另外 - 如果他们按ControlShiftAlt会发生什么?你在其他地方处理吗?

相关内容

  • 没有找到相关文章

最新更新