C/C++ windows系统下禁用按键/快捷键/鼠标

C/C++ windows系统下禁用按键/快捷键/鼠标

闲着没事还开发了个软件,可以快速禁用按键/快捷键/鼠标。

csdn-猿快键

github-猿快键

文件下载

蓝奏云 密码: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;
}

注意:

禁用后操作系统按键事件会失效,但是应用程序还是可以检测到按键的事件,所以部分程序可能仍然会响应按键操作。
最好不要同时禁用键盘按键和鼠标按键。
请勿将代码用于非法行为!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值