睡觉时检查输入

时间:2017-05-14 17:11:25

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

两个函数:CheckInput和SendKey

CheckInput检查要按下的Alt-J。当按下Alt-J时,切换bool,允许SendKey每500ms继续发送Enter键。

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

关于如何做到这一点的任何想法?它看起来很基本但我无法绕过它......

(基本上,每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;
}

3 个答案:

答案 0 :(得分:1)

如果您可以使用Windows事件循环,这将更加顺畅。

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

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

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

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

答案 1 :(得分:0)

正如评论者所提到的,你需要将你的循环放在线程中,就像在这个例子中一样:

atomic_int  temp;

std::thread t( [&temp]()
              {

                  while( temp!= -1){
                      std::this_thread::sleep_for(std::chrono::milliseconds(500));
                      temp=0;
                  }
              });

您可以使用条件变量并让一个线程等待它。

第二个线程(或主循环)将在循环中等待键盘输入,并在输入到达时发出条件变量的信号。

答案 2 :(得分:0)

我已经想过要检查自上次按Enter后的时间是否超过500毫秒,以便它在系统时间之外运行。不幸的是,我仍然没有找到同时运行两个并发进程的方法,但这似乎就像我需要它一样:

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

void CheckInput() {
    auto t1 = Clock::now() + chrono::seconds(1);
    int temp = 0;
    while (temp == 0) {
        if ((GetKeyState(0x12) & 0x8000) && (GetKeyState(0x4A) & 0x8000)) {
            Active = !Active;
        }
        if (Clock::now() > t1) {
            SendKey();
            temp = 1;
        }
    }
}

int main()
{
    while (1) {
        thread t1(CheckInput);
        t1.join();
    }
    return 0;
}

这基本上存储了CheckInput运行的时间,并设置了未来1秒的设定目标。然后它将继续检查输入,它还将检查时间是否已经超过设定目标,当它具有时,它将调用SendKey,然后再重复。