狂自私

导航

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);

}
View Code

 

posted on 2023-02-28 11:19  狂自私  阅读(45)  评论(0编辑  收藏  举报