C/C++ windows系统下禁用按键/快捷键/鼠标
文章目录
闲着没事还开发了个软件,可以快速禁用按键/快捷键/鼠标。
文件下载
蓝奏云 密码:645x
百度网盘 提取码: 2jvc
禁用键盘按键/快捷键
使用方法
- 格式:
disable_hotkey.exe -键码 -键码-键码 -键码-键码-键码 ......
假如要禁用:Ctrl + c和Ctrl + v(Ctrl、C、V的虚拟键码:162、67、86)
- 控制台运行
disable_hotkey.exe -162-67 -162-86
要查看所有的虚拟键码表请访问下面链接
下面是禁用键盘按键/快捷键代码
// disable_hotkey.cpp
#include <windows.h>
#include <vector>
#include <sstream>
#include <iostream>
#include <unordered_map>
#include <mutex>
// 钩子句柄
HHOOK hHook = NULL;
// 为了线程安全,定义一个互斥锁
std::mutex pressedKeysMutex;
// 定义快捷键组合的数据结构
struct KeyCombination {
std::vector<DWORD> keys;
};
// 存储要屏蔽的快捷键组合
std::vector<KeyCombination> blockedCombinations;
// 储存所有的快捷键按键,使用哈希表来提高查找效率
std::unordered_map<DWORD, bool> allKeys;
// 存储按下的快捷键
std::unordered_map<DWORD, bool> pressedKeys;
void ParseArguments(int argc, char* argv[]) {
for (int i = 1; i < argc; ++i) {
std::istringstream iss(argv[i]);
std::string key;
KeyCombination combination;
while (getline(iss, key, '-')) {
if (!key.empty()) { // 检查字符串是否为空
int vkCode = static_cast<int>(strtol(key.c_str(), NULL, 10)); // 将 nullptr 替换为 NULL
if (vkCode != 0 || errno != ERANGE) { // 检查转换是否成功
combination.keys.push_back(vkCode);
allKeys[vkCode] = true;
}
}
}
if (!combination.keys.empty()) {
blockedCombinations.push_back(combination);
}
}
printf("禁用快捷键数 = %d\n", blockedCombinations.size());
for (int i = 0; i < blockedCombinations.size(); i++) {
for (int j = 0; j < blockedCombinations[i].keys.size(); j++) {
printf("快捷键[%d],虚拟键值[%d] = %d\n", i, j, blockedCombinations[i].keys[j]);
}
}
}
// 打印按下的快捷键组合
void PrintKeyCombination(const KeyCombination& combination) {
std::cout << "禁用的快捷键组合: ";
for (DWORD key : combination.keys) {
std::cout << key << " ";
}
std::cout << std::endl;
}
// 检查当前按键是否属于任何一个禁用的快捷键组合
bool IsBlockedKeyCombination(DWORD vkCode) {
if (allKeys.find(vkCode) == allKeys.end()) {
return false;
}
for (const auto& combination : blockedCombinations) {
bool allKeysPressed = true;
// 检查组合中的所有键是否都已被按下
for (WORD key : combination.keys) {
if (!pressedKeys[key]) {
allKeysPressed = false;
break;
}
}
// 如果所有键都被按下了,则此阻止快捷键
if (allKeysPressed) {
PrintKeyCombination(combination);
return true;
}
}
return false;
}
// 钩子函数
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
KBDLLHOOKSTRUCT* pKeyBoard = (KBDLLHOOKSTRUCT*)lParam;
DWORD vkCode = pKeyBoard->vkCode;
// 锁定互斥锁以保证线程安全
std::lock_guard<std::mutex> lock(pressedKeysMutex);
// 更新按键状态
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
pressedKeys[vkCode] = true;
} else if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) {
pressedKeys[vkCode] = false;
}
// 检查按键状态
if (pressedKeys[vkCode]) {
std::cout << "Key " << vkCode << " is pressed." << std::endl;
} else {
std::cout << "Key " << vkCode << " is released." << std::endl;
}
// 检查当前按下的键是否匹配任何一个快捷键组合
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
if (IsBlockedKeyCombination(vkCode)) {
// 返回1表示禁用这次的按键操作
return 1;
}
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
// 安装钩子
void SetHook() {
HINSTANCE hInstance = GetModuleHandle(NULL);
if (!(hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0))) {
MessageBox(NULL, "Failed to install hook!", "Error", MB_ICONERROR);
}
}
// 卸载钩子
void Unhook() {
if (hHook) {
UnhookWindowsHookEx(hHook);
}
}
int main(int argc, char* argv[]) {
// 解析命令行参数
ParseArguments(argc, argv);
// 安装钩子
SetHook();
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 卸载钩子
Unhook();
return 0;
}
监控键盘事件
下面是只监控键盘操作的代码
#include <iostream>
#include <windows.h>
// 键盘钩子回调函数
LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
switch (wParam)
{
case WM_KEYDOWN:
std::cout << "按键按下,键码: " << pKeyBoard->vkCode << std::endl;
break;
case WM_KEYUP:
std::cout << "按键松开,键码: " << pKeyBoard->vkCode << std::endl;
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main()
{
// 设置键盘钩子
HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, NULL, 0);
if (keyboardHook == NULL)
{
std::cerr << "设置键盘钩子失败" << std::endl;
return 1;
}
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 取消钩子
UnhookWindowsHookEx(keyboardHook);
return 0;
}
禁用鼠标
使用方法
- 格式:
disable_mouse.exe --disableLeftButton --disableRightButton ......
- 禁用鼠标左键:
--disableLeftButton
- 禁用鼠标右键:
--disableRightButton
- 禁用鼠标中键:
--disableMiddleButton
- 禁用鼠标前进键:
--disableXButton1
- 禁用鼠标后退键:
--disableXButton2
假如要禁用:鼠标右键和鼠标中键
- 控制台运行
disable_mouse.exe --disableRightButton --disableMiddleButton
注意:
- 启动程序后,如果开启了控制台,请不要在控制台中进行点击,会导致控制台打印卡死,导致鼠标操作卡顿。
下面是禁用鼠标事件代码
// disable_mouse.cpp
#include <windows.h>
#include <stdio.h>
bool _disableXButton1 = false;
bool _disableXButton2 = false;
bool _disableMiddleButton = false;
bool _disableLeftButton = false;
bool _disableRightButton = false;
// WM_RBUTTONDOWN: 右键按下,WM_RBUTTONUP: 右键弹起
// WM_LBUTTONDOWN: 左键按下,WM_LBUTTONUP: 左键弹起
// WM_MBUTTONDOWN: 中键按下,WM_MBUTTONUP: 中键弹起,WM_MOUSEWHEEL: 鼠标滚轮滚动
// WM_MOUSEMOVE: 鼠标移动,WM_MOUSEHOVER: 鼠标悬停
// WM_XBUTTONDOWN: 侧边按钮按下,WM_XBUTTONUP: 侧边按钮弹起
// 侧边按钮:XBUTTON1鼠标前进键,XBUTTON2鼠标后退键
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
// 监控鼠标操作
printf("nCode: %d, wParam: %d\n", nCode, wParam);
// 返回1表示禁用这次的按键操作
if (_disableLeftButton && (wParam == WM_LBUTTONDOWN || wParam == WM_LBUTTONUP)) {
return 1; // 禁用左键点击
}
if (_disableRightButton && (wParam == WM_RBUTTONDOWN || wParam == WM_RBUTTONUP)) {
return 1; // 禁用右键点击
}
if (_disableMiddleButton && (wParam == WM_MBUTTONDOWN || wParam == WM_MBUTTONUP)) {
return 1; // 禁用中键点击
}
if (wParam == WM_XBUTTONDOWN || wParam == WM_XBUTTONUP) {
MSLLHOOKSTRUCT *pMouseStruct = (MSLLHOOKSTRUCT *)lParam;
if (_disableXButton1 && GET_XBUTTON_WPARAM(pMouseStruct->mouseData) == XBUTTON1) {
return 1; // 禁用 XBUTTON1
}
if (_disableXButton2 && GET_XBUTTON_WPARAM(pMouseStruct->mouseData) == XBUTTON2) {
return 1; // 禁用 XBUTTON2
}
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main(int argc, char* argv[]) {
// 获取当前控制台窗口句柄
HWND hWnd = GetConsoleWindow();
// 隐藏控制台窗口
ShowWindow(hWnd, SW_HIDE);
// 解析传入的参数
for (int i = 1; i < argc; ++i) {
if (strcmp(argv[i], "--disableLeftButton") == 0) {
_disableLeftButton = true;
} else if (strcmp(argv[i], "--disableRightButton") == 0) {
_disableRightButton = true;
} else if (strcmp(argv[i], "--disableMiddleButton") == 0) {
_disableMiddleButton = true;
} else if (strcmp(argv[i], "--disableXButton1") == 0) {
_disableXButton1 = true;
} else if (strcmp(argv[i], "--disableXButton2") == 0) {
_disableXButton2 = true;
}
}
// 设置鼠标钩子
HHOOK hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, 0, 0);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) != 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 卸载钩子
UnhookWindowsHookEx(hhkLowLevelMouse);
return 0;
}
监控鼠标事件
下面是只监控键盘操作的代码
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
// 监控鼠标操作
printf("nCode: %d, wParam: %d\n", nCode, wParam);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main(int argc, char* argv[]) {
// 设置鼠标钩子
HHOOK hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, 0, 0);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) != 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 卸载钩子
UnhookWindowsHookEx(hhkLowLevelMouse);
return 0;
}