禁用右键单击按钮[C ++]

时间:2016-06-06 04:04:41

标签: c++

有没有办法禁用右键单击按钮?我正在尝试使用鼠标钩子,当你运行程序时,它只是禁用右键单击按钮。

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

任何人都有任何线索,如果我做得对,或者我是否需要实际进入注册表以实际禁用右键单击鼠标?

1 个答案:

答案 0 :(得分:0)

是的,您可以通过安装低级鼠标挂钩来禁用鼠标事件。如果LowLevelMouseProc大于或等于零,则nCode回调应返回非零值。此外,您不仅应阻止WM_RBUTTONDOWN Windows消息,还应阻止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,仅为目标应用程序安装挂钩。您的另一个选择是通过替换其消息处理例程并过滤鼠标事件消息来继承目标窗口。