如何永久禁用鼠标滚轮按钮

时间:2019-07-02 13:50:39

标签: winapi win32gui

我有一个困扰我的问题。所以我有一个朋友,他的鼠标滚轮刚刚坏了,但不是机械的,它发疯了-自己滚动而没有任何输入。我编写了一个简单的c ++ / batch程序,该程序询问您是否要通过修改注册表中的值来禁用滚动按钮:

reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v "WheelScrollChars" /t REG_SZ /d 0 /f
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v "WheelScrollLines" /t REG_SZ /d 0 /f

不幸的是,它仅在某些应用程序中有效,例如铬。就像他打开Adobe Premiere或任何其他软件时一样,滚动实际上并没有被禁用-它会保持自身随机向上和向下滚动。是的,我知道购买新鼠标不是问题,但是我很好奇是否还有其他解决方法。我找到了一个名为X-Mouse Button Control的软件(我猜是用C / C ++编写的),实际上它具有永久禁用滚动的选项,但仅在程序运行时才起作用。我试图在IDA中反转其二进制文件,尽管找不到用于禁用整个系统中滚动的实际功能,而不仅仅是几个Windows应用程序。

所以我想问一下,也许您有一些想法,如果C ++中有可能使其在整个Windows中禁用(在任何运行的应用程序中)?我想如果有人通过X-Mouse Button Control这个软件做到了,这可能是可能的,但我还没有发现任何东西。无论如何,我们将非常感谢您的帮助,非常感谢您的答复!

1 个答案:

答案 0 :(得分:0)

  

该方法已在注释中给出。我所做的就是   熟悉钩子的用法。

以下是最简洁的实现代码供您参考:

#include <Windows.h>
#include <iostream>

using namespace std;

HHOOK mouseHook;

LRESULT __stdcall MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
        switch (wParam)
        {       
        case WM_MOUSEWHEEL:
            return 1;
        }
    }
    return CallNextHookEx(mouseHook, nCode, wParam, lParam);
}

void SetHook()
{
    if (!(mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookCallback, NULL, 0)))
    {
        cout << "Failed to install mouse hook!" << endl;
    }
}

void ReleaseHook()
{
    UnhookWindowsHookEx(mouseHook);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    SetHook();
    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

鼠标滚轮被鼠标钩拦截,因此禁用了鼠标滚轮。