代码之家  ›  专栏  ›  技术社区  ›  Greg Domjan

当键盘日志不可用时,如何记录击键?

  •  0
  • Greg Domjan  · 技术社区  · 17 年前

    最初使用MS特定的键盘日志挂钩(WH_JOURNALRECORD)设置C++应用程序后,我们发现它在Vista上不起作用,除非以管理员身份运行并启用uiAccess。 MSDN Question - Journaling hooks on Vista?

    我们希望以友好的方式记录用户的按键序列,并在以后的某个日期重复。用户按下录制按钮,将显示一个带有停止按钮和录制键的对话框。

    使用日志挂钩的一个优点是,你只会得到有作用的按键。按住shift键不会报告100个shift键,但会在您按下一个字母时报告使用情况。 另一个优点是,您可以将焦点设置在应用程序之外的区域,例如另一个应用程序窗口,并在用户交互时记录操作。

    除了将键盘捕获部分作为现有应用程序的一个单独的可执行文件,以管理员身份使用uiAccess运行外,我还在寻找其他关于如何记录2K、2K3、2K8、XP、Vista等windows上的击键的想法。

    编辑:我知道记录任何东西都有安全问题,很明显,如果你能在用户没有注意到的情况下做这样的事情,你就有典型的击键记录器用于黑客攻击。Soooooo。....

    有没有一种方法可以让这个用户和他们的应用程序在同一级别(或更低级别)运行并捕获击键?让它弹出vista安全对话框,你确定对话框会正常吗?但该进程不能用uiAccess标记(否则它将无法与系统的其他部分正常交互),在98%的情况下,它将由没有权限提升为管理员的用户运行。

    2 回复  |  直到 17 年前
        1
  •  1
  •   MSalters    17 年前

    即使你能,你也可能会发现微软在下一个补丁中修复了这个错误。Vista中的更改是有意的,并且有一个明确的方法(uiAccess==true)仍然可以做你想做的事情。

        2
  •  0
  •   Greg Domjan    17 年前

    我们通过使用SetWindowsHook解决了主要问题。

    const HMODULE hDLL = ::GetModuleHandle(DLL_NAME);
    ::SetWindowsHookEx(WH_KEYBOARD_LL, myKeyboardProcCallback, hDLL, 0);
    

    回调现在必须管理击键信息并将其转换为可用的序列——即当按下ctrl+键时,不要记录多次ctrl按下。

    推荐文章