避坑 c++ windows 防止控制台点击(防止进入选择模式)、Ctrl+C暂停程序


前言

我们有时候要写一个c++控制台游戏时,点击或Ctrl+C成了我们巨大的阻碍:我们有时候会点击暂停程序,这样就会影响程序运行,还会破坏游戏规制

网上的说法

网上的说法众说纷纭,有加钩子的、有ENABLE_MOUSE_INPUT

解决方法

我们可以用SetConsoleMode(hConsole, mode & ~(ENABLE_PROCESSED_INPUT|ENABLE_QUICK_EDIT_MODE));
上代码!:

#include <windows.h>  
#include <iostream>  

void DisableConsoleSelection()  
{  
    // 获取控制台输入句柄  
    HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);  
    
    // 获取控制台模式  
    DWORD mode;  
    GetConsoleMode(hConsole, &mode);  
    
    // 禁用鼠标输入模式  
	SetConsoleMode(hConsole, mode & ~(ENABLE_PROCESSED_INPUT|ENABLE_QUICK_EDIT_MODE)); 
}  

int main()  
{  
    DisableConsoleSelection();  

    std::cout << "鼠标选择模式已禁用,请用回车键继续..." << std::endl;
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    INPUT_RECORD inputRecord;  
    DWORD eventsRead; 
    while (true) {
        printf("a\n") // 测试程序会不会断
    }
    return 0;  
}

我们尝试识别是否鼠标按下:

#include <windows.h>  
#include <iostream>  

void DisableConsoleSelection()  
{  
    // 获取控制台输入句柄  
    HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);  
    
    // 获取控制台模式  
    DWORD mode;  
    GetConsoleMode(hConsole, &mode);  
    
    // 禁用鼠标输入模式  
	SetConsoleMode(hConsole, mode & ~(ENABLE_PROCESSED_INPUT|ENABLE_QUICK_EDIT_MODE)); 
}  

int main()  
{  
    DisableConsoleSelection();  

    std::cout << "鼠标选择模式已禁用,请用回车键继续..." << std::endl;
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    INPUT_RECORD inputRecord;  
    DWORD eventsRead; 
    while (true) {
        // Read input events  
        ReadConsoleInput(hInput, &inputRecord, 1, &eventsRead);  

        // Output the event type for debugging  
        std::cout << "Event type: " << inputRecord.EventType << std::endl;  

        // Check if the event is a mouse event  
        if (inputRecord.EventType == MOUSE_EVENT) {  
            MOUSE_EVENT_RECORD mouseEvent = inputRecord.Event.MouseEvent;  

            // Output button state and event flags for debugging  
            std::cout << "Button state: " << mouseEvent.dwButtonState << ", Event flags: " << mouseEvent.dwEventFlags << std::endl;  

            // Process mouse event  
            if (mouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) {  
                std::cout << "Left button pressed at (" << mouseEvent.dwMousePosition.X << ", "  
                          << mouseEvent.dwMousePosition.Y << ")" << std::endl;  
            } else if (mouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED) {  
                std::cout << "Right button pressed at (" << mouseEvent.dwMousePosition.X << ", "  
                          << mouseEvent.dwMousePosition.Y << ")" << std::endl;  
            } else if (mouseEvent.dwEventFlags == MOUSE_MOVED) {  
                std::cout << "Mouse moved to (" << mouseEvent.dwMousePosition.X << ", "  
                          << mouseEvent.dwMousePosition.Y << ")" << std::endl;  
            }  
        }
    }

    return 0;  
}

后文

我为了找这个防止控制台点击暂停程序的问题找了10天了!!!

==制作不易,还望给个硬币点赞!!!==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值