c++ - sleep 时检查输入

标签 c++ c++11 visual-studio-2015 c++14

两个函数:CheckInput和SendKey

CheckInput 检查是否按下了 Alt-J。当按下 Alt-J 时,会触发一个 bool 值,允许 SendKey 每 500 毫秒持续发送一次 Enter 键。

我需要 CheckInput 仍然能够获取用户输入并更改 bool - 从而停止发送输入 - 而 SendKey 仍在 sleep 中等待,否则现在我必须按住 Alt-J 直到下一个500ms 到。

关于如何做到这一点有什么想法吗?它看起来很基础,但我无法理解它......

(基本上,一个脚本每 500 毫秒按一次回车,并且可以在不需要等待 500 毫秒的情况下打开和关闭)

void CheckInput() {
    if ((GetKeyState(0x12) & 0x8000) && (GetKeyState(0x4A) & 0x8000)) {
        Active = !Active;
    }
}

void SendKey() {
    if (Active) {
        keybd_event(0x0D, 0x0A, 0, 0);
        Sleep(16);
        keybd_event(0x0D, 0X0A, KEYEVENTF_KEYUP, 0);
        Sleep(500);
    }
}

int main()
{
    while (1) {
        thread t1(CheckInput);
        thread t2(SendKey);
        t1.join();
        t2.join();
    }

    return 0;
}

最佳答案

如果您可以使用 Windows 事件循环,这会更顺利。

如果你不能,你应该模拟它。

创建一个可以存储事件信息的线程安全队列。您需要两种类型的事件 - 击键和计时器滴答。

一个线程将休眠 500 毫秒并发送一个定时器滴答事件 - 在一个循环中。另一个线程将调用 Console.ReadKey 并发送击键事件 - 也在循环中。

您的主线程将等待事件从队列中到达并处理它们。

关于c++ - sleep 时检查输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43966709/

相关文章:

c++ - C++ 编码人员通常会显式地进行 move ,还是只依赖编译器来完成?

c++ - 什么时候使用 std::launch::deferred?

.net - nuget 的程序集被 GAC 的程序集覆盖

c++ - 从 Visual Studio 生成 CMakeLists.txt

c++ - 如何使用智能指针构建树?

c++ - 重构 'execute and log'模式

c++ - 在 while 循环中使用 std::condition_variable::wait 是否正确?

visual-studio - 为什么我的进程在 64 位操作系统上使用 vshost32.exe 而不是 vshost.exe 运行?

visual-studio-2015 - Visual Studio Test Runner 提示找不到 'xunit.core, Version=2.x.0'

c++ - 我将如何在没有链接的情况下编译 OpenCV 程序?