如何使用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");
}

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

是的,您可以通过安装低级鼠标挂钩来禁用鼠标事件。如果nCode大于或等于零,则LowLevelMouseProc回调应返回非零值。此外,您不仅应该阻止WM_RBUTTONDOWN窗口消息,还应该阻止WM_RBUTTONUP消息,否则目标应用程序可能无法正常工作。

这个代码很奇怪:

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

第二个if子句将始终为true。也许你的意思是

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

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

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

然而,系统范围的钩子可能非常危险。一个小错误很容易使整个系统不稳定。通过在SetWindowsHookEx调用中指定目标应用程序的消息线程id,仅为其安装挂钩。您的另一个选择是通过替换其消息处理例程和过滤鼠标事件消息来对目标窗口进行子类化。

最新更新