C++ 监听指定的按键后结束自己
这里就是简单的监听键盘按下的组合键后结束程序运行,应用于简单自动化程序的随时停止。

/* * 测试程序,操作子线程 */ int test_01() { int i{}; while (i < 50) { move_left_clik_mouse(1450, 528); //自定义函数,源码参考前一篇博客 Sleep(300); INPUT inputs[2]{}; //还必须在这儿分配好,不能使用堆 //清空验证码,假设有 inputs[0].type = INPUT_KEYBOARD; inputs[0].ki.wVk = VK_SPACE; //ctrl inputs[1].type = INPUT_KEYBOARD; inputs[1].ki.wVk = VK_SPACE; inputs[1].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT)); ++i; std::cout << i << ','; } return i; } /* * 注册热键,并循环监听是否有按下热键,若是按下,先注销热键,然后结束自己,向主线程发送数据,通知其结束运行。 * ctrl+k表示结束本程序 * 不管返回了什么,主线程都应该立即结束程序 */ int monitor_hot_key() { if (!RegisterHotKey( NULL, 1, MOD_CONTROL, 0x4B)) //0x4B is 'k' { std::cout << "Hotkey 'ctrl+k' registered:" << GetLastError() << "\n"; return 0; } MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0) != 0) { if (msg.message == WM_HOTKEY) { UnregisterHotKey(nullptr, 1); std::cout << "已按下。\n"; return 1; //_tprintf(_T("WM_HOTKEY received\n")); } } return 0; } int main() { //std::ios::sync_with_stdio(false);// 禁用同步 //std::locale::global(std::locale("")); //本地化 ////应该尽量避免目标位置有变动。 //move_left_clik_mouse(3320, 550); //HWND hWnd = GetForegroundWindow(); //获取活动窗口的句柄(因为鼠标点击过了,所以该窗口就是活动窗口) //std::wstring result; //size_t number_of_retries{}; //标记重复次数,大于10次之后,就停止识别 //do { // CaptureAnImage(hWnd, 96, 31, 3192, 489, L"D:\\工作\\temp\\2023年1月10日\\screenshot.bmp"); // if (!get_ocr_result(result, 4)) { // std::wcout << L"验证码识别出错\n"; // system("cls"); // move_left_clik_mouse(3246, 500); // Sleep(100); // move_left_clik_mouse(3400, 500); //移开鼠标,否则影响识别 // Sleep(1000); // number_of_retries++; // if (number_of_retries > 10) { // exit(0); // } // } // else { // std::wcout << result << L'\n'; // break; // } //} while(true); // //input_Verification_code(result); //Sleep(500); //多线程 auto f1 = std::async([] {test_01(); }); auto f2 = std::async([] {monitor_hot_key(); }); //两个子线程都需要在运行,任何一个线程结束就要结束程序 //如果至少有一个后台任务正在运行 while (f2.wait_for(std::chrono::seconds(0)) != std::future_status::ready) { //如果f2在运行 //f1运行完成的话 if (f1.wait_for(std::chrono::seconds(0)) == std::future_status::ready){ exit(0); } } exit(0); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?