如何使用 C++ 在 Windows 上禁用右键单击按钮?

问题描述 投票:0回答:1

有没有办法禁用右键单击按钮?

我正在尝试使用 鼠标钩子,它只会在您运行程序时禁用右键单击按钮。

#include <iostream>
#include <vector>
#include <algorithm>

#include <cstdlib>
#include <conio.h>
#define _WIN32_WINNT 0x0500
#define WM_RBUTTONDOWN 0x0204
#include <windows.h>

/* Disable mouse using low-level mouse hook */
HHOOK miHook;

    //Starting Hook Procedure
    LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        MSLLHOOKSTRUCT &msll = *(reinterpret_cast<MSLLHOOKSTRUCT*>(lParam));

        if (wParam == WM_RBUTTONDOWN) {
                cout << "OOO";
            if (WM_RBUTTONDOWN) {
                return -1; // Make this click be ignored
            }
        }
    }
    return CallNextHookEx(miHook, nCode, wParam, lParam);
}

int main() {
    system("pause");
}

这是正确的方法,还是我需要实际进入注册表才能真正禁用鼠标右键单击?

c++ windows click mouse mouse-hook
1个回答
1
投票

是的,您可以通过安装低级鼠标钩子来禁用鼠标事件。如果

LowLevelMouseProc
大于或等于零,您的
nCode
回调应该返回非零值。此外,您不仅应该阻止
WM_RBUTTONDOWN
窗口消息,还应该阻止
WM_RBUTTONUP
,否则目标应用程序可能无法正常工作。

这段代码很奇怪:

if (wParam == WM_RBUTTONDOWN) {
                cout << "OOO";
            if (WM_RBUTTONDOWN) {
                return -1; // Make this click be ignored
            }

第二个

if
子句将永远为真。也许你的意思是

if((WM_RBUTTONDOWN == wParam)||(WM_RBUTTONDOWN == wParam))
  return(-1);

此外,回调通过处理 Windows 消息在您的线程上下文中运行,因此您的代码必须有一个消息队列,它不能是简单的控制台应用程序

这个钩子在安装它的线程的上下文中被调用。 该调用是通过向安装了 钩。因此,安装钩子的线程必须有一个 消息循环。

然而,系统范围的钩子可能非常危险。一个小错误很容易使整个系统不稳定。通过在

SetWindowsHookEx
调用中指定其消息线程 ID,仅为目标应用程序安装挂钩。您的另一个选择是通过替换其消息处理例程和过滤鼠标事件消息来子类化目标窗口。

© www.soinside.com 2019 - 2024. All rights reserved.