如果我的程序不在前台,如何检测鼠标滚动事件

时间:2014-02-02 00:37:12

标签: c++ windows

我写了一个在游戏中渲染叠加的程序,显示了一些额外的信息。我可以通过使用GetKeyState来检测键盘和一些鼠标按键,但是没有用于向上和向下滚动的虚拟键代码,我也想使用它。

我知道滚动的处理方式更多的是事件,而不是按键,但这并没有真正帮助。 那么我的问题有什么解决方案吗?

我想到的事情:

  1. 通过某些功能检测滚动事件?
  2. 以某种方式将Windows消息发送到我的程序中的游戏(称为Hooking IIRC)
  3. 我正在使用Visual Studio 2013 Express [C ++]

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

我使用以下代码解决了这个问题。

LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    using namespace MouseLog;
    MSLLHOOKSTRUCT * pMouseStruct = (MSLLHOOKSTRUCT *)lParam;

    if (pMouseStruct != NULL)
    {
        if (wParam == WM_MOUSEWHEEL)
        {
            if (HIWORD(pMouseStruct->mouseData) == 120) MScrollUp = 1;
            else MScrollDown = 1;
        }
        if (wParam == WM_MBUTTONDOWN)
            MScrollBtn = 1;

        //printf("Mouse position X = %d  Mouse Position Y = %d\n", pMouseStruct->pt.x, pMouseStruct->pt.y);
    }
    return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}

DWORD WINAPI MouseLogger(LPVOID lpParm)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, NULL);

    MSG message;
    while (GetMessage(&message, NULL, 0, 0)) {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    UnhookWindowsHookEx(hMouseHook);
    return 0;
}

要启动MouseLogger,请使用CreateThread()。

答案 2 :(得分:0)

我知道没有鼠标滚动的关键状态,但还有其他类似的东西 WM_MOUSEWHEEL

如果这回答了您的问题,您可能需要查看此

http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx

否则,如果这不帮助你,我很乐意帮助你,如果这个剂量帮助

答案 3 :(得分:0)

您可以使用旧版游戏API DirectInput。我知道当你使用DISCL_BACKGROUND标志时窗口在后台时肯定会有效。