我有一个困扰我的问题。所以我有一个朋友,他的鼠标滚轮刚刚坏了,但不是机械的,它发疯了-自己滚动而没有任何输入。我编写了一个简单的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这个软件做到了,这可能是可能的,但我还没有发现任何东西。无论如何,我们将非常感谢您的帮助,非常感谢您的答复!
答案 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;
}
鼠标滚轮被鼠标钩拦截,因此禁用了鼠标滚轮。