代码之家  ›  专栏  ›  技术社区  ›  Basic

使用vb.net捕获所有键盘事件

  •  5
  • Basic  · 技术社区  · 16 年前

    我用一个简单的文本框编写了一个应用程序,它试图根据用户的打字习惯来识别用户(按键间隔、按键持续时间、按键之间的间隔时间,即A->S对某些用户来说比A->V快,而对其他用户来说则比A->V短,具体取决于打字方式)。它远非完美,但它确实正确地识别出了风格上的适度大的差异。

    我希望将其用作安全监视器的一种形式-如果用户的输入风格不符合公认的模式,请向中央服务器报告。

    当然,测试的下一步是开始捕获“常规”的打字习惯——比如浏览、在应用程序之间切换等。

    我不知道该如何为所有应用程序捕获键盘输入(不包括登录/欢迎屏幕、备用桌面等)-我没有理由分析它,而且可能没有足够的输入来进行分析。

    免责声明: 是的,我知道这很危险地写了一个冗长的键盘记录器,但是如果我想这么做的话,我会在C++中写一个键盘驱动程序——我敢肯定它会比一个庞大的.NET MSIL程序集更精简和更容易混淆。毫无疑问,我会避开“这是一个键盘记录者”的评论,但我已经撞到墙了,需要问个地方……

    我不需要隐藏应用程序——但理想情况下,我希望能够在没有明确用户确认的情况下捕获输入(管理员安装后除外)——如果需要用户确认,我可以接受(只是)如果它可以一次性完成,并且我有某种方法来监视和报告拒绝。

    这在.NET中是可能的吗?我能找到的唯一例子要么是通过在每一个看起来笨重的键上添加一个事件钩子来操作,我想这很容易出错。-或者-他们轮询键盘状态以确定按下的键。这对我不好,因为a)我需要按键的精确时间,所以按键的上下活动是必须的,b)这很讨厌。

    如果框架被设计成专门禁止这样做,我不会感到惊讶,在这种情况下,我必须返回到一些非托管代码来提供事件。我显然更喜欢一路使用托管代码。

    感谢您的帮助。

    编辑: 多亏了Hans Passant的回答,这是迄今为止我发现的最好的资源: http://www.codeguru.com/columns/vb/article.php/c4831

    2 回复  |  直到 15 年前
        1
  •  5
  •   abatishchev Karl Johan    15 年前

    谷歌 SetWindowsHookEx + WH_KEYBOARD_LL ,谷歌的关键词。这就设置了一个低级键盘挂钩。它不是全局挂钩,因此可以在vb.net程序中工作。

        2
  •  0
  •   Andrey    16 年前

    .NET不提供任何此类服务,因此您必须降低级别并使用p/invoke。选项是:

    • 赢钩
    • 使用GetAsyncKeyState进行轮询