【问题标题】:How to catch Keyboard and mouse events?如何捕捉键盘和鼠标事件?
【发布时间】:2010-04-18 23:16:28
【问题描述】:

我想创建一个应用程序。当用户按下键盘上的特殊键或/并使用滚轮时,此应用程序必须执行某些操作。此应用程序是一项服务。它没有窗户。我想捕捉使用其他应用程序设计的任何键盘或鼠标事件。

例如,您正在通过 3rd 方应用程序观看电视。如果您按Ctrl + Shift 并使用滚轮,我的应用程序会更改音量。

我使用 Windows 7 x64 和 Visual Studio 2008。

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    当各种事件发生时,您可以拨打SetWindowsHookEx() 得到通知。您可能希望使用键盘钩子和鼠标钩子来监视鼠标事件。

    【讨论】:

    • 不清楚。我打电话给hhk=::SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc1, 0, 0);。但这不起作用。你能给我更多的信息吗?
    • 使用普通的键盘挂钩和鼠标挂钩可能会更好。低级键盘钩子可能被调用得太早 - 我不确定它是否会给你你需要的信息。似乎有一个从 MSDN 页面链接的示例 - 也许这会有所帮助?
    • 请注意,_LL 挂钩要求您有一个 GetMessage()/DispatchMessage() 循环,即使您没有任何可见窗口;如果你只是 Sleep() 或 Wait...(),那么它就行不通了。由于您使用的是 x64,请注意 _LL 挂钩适用于 32 位和 64 位应用程序,但普通挂钩仅加载到具有相同位数的进程中,因此 32 位进程只会从其他进程获取事件32 位进程,64 位进程类似。
    【解决方案2】:

    如果您的应用程序是真正的 Win32 服务,那么在 Vista 及更高版本上,应用程序将不会接收键盘或鼠标事件 - 为了关闭安全漏洞(搜索“粉碎攻击”),Microsoft 隔离了所有服务以防止它们与用户互动。

    您需要让您的应用程序在与交互式登录用户的会话中运行。

    【讨论】:

      【解决方案3】:

      可以使用RAW INPUT方式,比GetAsyncKeyState等更可靠

      我在代码项目上写了this article,可能对你有用。

      同时提供 C# 和 MASM 源代码版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多