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

How to disable mouse scroll wheel button permanently

我有一个问题困扰着我。所以我有一个朋友,他的鼠标滚轮刚刚坏了,但不是机械的,它只是发疯了——在没有任何输入的情况下自行滚动。我写了一个简单的 c++/批处理程序,它会询问您是否要通过修改注册表中的值来禁用滚动按钮:

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

不幸的是,它仅适用于某些应用程序,例如chrome。就像当他打开 Adob​​e Premiere 或任何其他软件时,滚动实际上并没有被禁用——它一直在随机上下滚动。是的,我知道买一只新鼠标不是问题,但我很好奇是否还有其他解决方法。我发现了一款​​名为 X-Mouse Button Control 的软件(我猜是用 C/C++ 编写的),它实际上有一个选项可以永久禁用滚动,但它只在程序为 运行 时有效。我试图在 IDA 中反转它的二进制文件,但找不到用于在整个系统中禁用滚动的实际函数,而不仅仅是几个 Windows 应用程序。

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

The method has been given in the comments. All I have done is to familiarize you with the use of hook.

以下是最简洁的实现代码,供大家参考:

#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;
}

鼠标滚轮被鼠标钩子拦截,导致鼠标滚轮被禁用