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

Winapi 如何永久禁用鼠标滚轮按钮,winapi,win32gui,Winapi,Win32gui,我有个问题困扰着我。所以我有一个朋友的鼠标滚轮坏了,但不是机械的,它只是疯了——没有任何输入就自动滚动。我编写了一个简单的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 "WheelScro

我有个问题困扰着我。所以我有一个朋友的鼠标滚轮坏了,但不是机械的,它只是疯了——没有任何输入就自动滚动。我编写了一个简单的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。就像他打开AdobePremiere或任何其他软件时一样,滚动实际上并没有被禁用——它会自动上下随机滚动。是的,我知道买一只新老鼠不成问题,但我只是好奇有没有别的办法。我发现了一个叫做X-Mouse Button Control(我想是用C/C++编写的)的软件,它实际上有一个永久禁用滚动的选项,但它只能在程序运行时工作。我试图在IDA中反转它的二进制文件,尽管在整个系统中找不到用于禁用滚动的实际函数,而不仅仅是几个Windows应用程序

所以我想问一下,如果C++中有可能使它在整个Windows(在运行的任何应用程序中)禁用,那么你有什么想法?我想如果有人通过这个软件,X-鼠标按钮控制,这是可能的,但我还没有找到任何东西。无论如何,非常感谢您的帮助,我期待着您的回复,谢谢

该方法已在评论中给出。我所做的就是 让你熟悉钩子的用法

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

#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;
}
#包括
#包括
使用名称空间std;
HHOOK鼠标套;
LRESULT uu stdcall MouseHookCallback(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
如果(nCode>=0)
{
交换机(wParam)
{       
案例WM_鼠标滚轮:
返回1;
}
}
返回CallNextHookEx(鼠标指针、nCode、wParam、lParam);
}
void SetHook()
{
if(!(mouseHook=SetWindowsHookEx(WH\u MOUSE\u LL,MouseHookCallback,NULL,0)))
{

或者你可以花10美元买一个新的鼠标…很可能你提到的程序是通过将其插入系统输入队列来工作的。你可以用WH_mouse_LL钩子禁用鼠标滚轮(当wParam==WM_mouseweel时只需返回1)…但程序当然必须运行。注册表值仅控制首选滚动距离,应用程序可以根据需要进行自定义处理。低级挂钩是AFAIK的唯一软件选项。低级挂钩不需要任何DLL。它只是几行代码(在LowLevel MouseProc中)非常感谢!这正是我想要实现的,它工作得非常完美!