1.问题和需求
解决 不小心点击窗口内容就会导致控制台进程、打印等暂停的问题
2.原因
VS控制台默认提供的暂停功能导致,即默认打开了快速编辑模式,此模式下点击窗口内内容会暂停控制台程序的运行。
3.解决方案
-
每次运行时对有需要的exe程序关闭快速编辑模式。
- 运行时选择当前exe程序窗口上方的边框栏 —> 右键 —>属性 —> 取消勾选快速编辑模式
- 弊端:对于多窗口、多用户使用的实际程序来说不现实。仅推荐测试使用
-
使用MAPI的方式设置控制台模式,移除快速编辑模式,代码如下:
//关闭控制台程序的快速编辑模式,否则会出现点击界面,程序将会变成阻塞状态,不按回车无法继续运行 void CloseQuickEditMode() { HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); // 获取句柄 DWORD mode; GetConsoleMode(hStdin, &mode); //获取当前控制台模式 mode &= ~ENABLE_QUICK_EDIT_MODE; //移除快速编辑模式 SetConsoleMode(hStdin, mode); //设置修改后的控制台模式 }
-
推荐使用这种方法。多窗口使用时,将此方法封装在工具库中,在每个窗口逻辑代码最前面调用此函数即可
-
如还需增加/移除其他模式(如插入模式),可以参考MSDN :
注意:以上解决方案关闭快速编辑模式以后,控制台将变为不可选模式,即也无法进行选中内容复制等操作
-
4.测试代码
//关闭控制台程序的快速编辑模式,否则会出现点击界面,程序将会变成阻塞状态,不按回车无法继续运行
void CloseQuickEditMode() {
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); // 获取句柄
DWORD mode;
GetConsoleMode(hStdin, &mode); //获取当前控制台模式
mode &= ~ENABLE_QUICK_EDIT_MODE; //移除快速编辑模式
SetConsoleMode(hStdin, mode); //设置修改后的控制台模式
}
int main() {
// 关闭控制台程序的快速编辑模式
CLoseQuickEditMode();
int ch, i = 0;
while (1) {
//测试使用f1-f10
if (_kbhit()) {
ch = _getch();
if (ch == 27) { break; }//当按下ESC时退出循环
if (ch == 59) printf("F1\n");
if (ch == 60) printf("F2\n");
if (ch == 61) printf("F3\n");
if (ch == 62) printf("F4\n");
if (ch == 63) printf("F5\n");
if (ch == 64) printf("F6\n");
if (ch == 65) printf("F7\n");
if (ch == 66) printf("F8\n");
if (ch == 67) printf("F9\n");
if (ch == 68) printf("F10\n");
}
Sleep(1000);
cout << "test: " << i++ << endl;
}
system("pause");
return 0;
}
运行结果:
5.部分控制台需要选择文本复制的问题
由于“快速编辑模式”是windows系统自带的,打开即可选中控制台中的内容进行操作,但是系统也会对应的挂起程序(即暂停),这个操作与快速编辑模式绑定,暂未找到可分离的方式。
解决思路:
-
需要“可选择控制台内容”的可执行程序数量 > 不需要的
-
使用 某个按键开启/关闭快速编辑功能,以下示例代码使用了“y”键
-
void UpdateQuickEditMode(int i) { HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); DWORD mode; GetConsoleMode(hStdin, &mode); //默认 关闭 mode &= ~ENABLE_QUICK_EDIT_MODE; //移除快速编辑模式 if (i & 1) { //奇数 打开 mode = ENABLE_QUICK_EDIT_MODE; } SetConsoleMode(hStdin, mode); } void testEdit() { int key; int i = 0; UpdateQuickEditMode(i++); while (true) { if (_kbhit()) {//如果有按键按下,则_kbhit()函数返回真 key = _getch();//使用_getch()函数获取按下的键值 cout << key << endl; if (key == 121) { // y UpdateQuickEditMode(i++); } } Sleep(1000); cout << "Hello" << endl; } } int main() { testEdit(); system("pause"); return 0; }
-
将工具代码写入工具库,供每一个需要的可执行程序使用。默认关闭快速编辑模式,需要时按下y键打开,不再使用按下y键关闭(也可以改为按不同的键开关)
-
总的来说会更方便操作
-
-
需要“可选择控制台内容”的可执行程序数量 < 不需要的(如只有日志功能需要),默认全部关闭,不使用按键功能,在需要使用编辑功能时,直接按下 Ctrl+M 对内容进行选择( 或 选择 右键控制台边框栏 --> 编辑 --> 标记 对内容进行选择 )。选择内容期间后台程序挂起,不运行,按下回车键后恢复。
- 可以 缩减空间、程序不需要一直开启等待用户输入,减少条件判断
- 可以 缩减空间、程序不需要一直开启等待用户输入,减少条件判断