前言
我们有时候要写一个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天了!!!
==制作不易,还望给个硬币点赞!!!==