暂停循环,直到按下某个键

时间:2014-08-07 16:07:19

标签: c++ winapi

我在我的main函数中使用了一个如下所示的循环:

while (1)
{
cout << "Hello world" << endl;
}

如何在按下按键时暂停此循环并恢复? 例如:当我按住[TAB]时,循环运行。当我放手时,循环再次暂停。

2 个答案:

答案 0 :(得分:1)

您可以使用GetAsyncKeyState()

功能

这是一个适应你所描述的: 已编辑 ,以便在 SHIFT 键被点击时退出循环。

#include <stdio.h> //Use these includes: (may be different on your environment) 
#include <windows.h>

BOOL isKeyDown(int key)  ;
int main(void)
{
    int running = 1;
    while(running)
    {
        while(!isKeyDown(VK_TAB)); //VK_TAB & others defined in WinUser.h
        printf("Hello World");
        Delay(1.0);
        if(isKeyDown(VK_SHIFT)) running = 0;//<SHIFT> exits loop
    }

    return 0;   
}


BOOL isKeyDown(int key)
{
    int i;
    short res;

    res = GetAsyncKeyState(key);
    if((0x80000000 &res  != 0) || (0x00000001 & res != 0)) return TRUE; 

    return FALSE;   
}

答案 1 :(得分:0)

我不知道你是否打算使用线程...但我想出了一个解决方案,将循环置于一个线程中,然后在主线程上检查TAB键状态。如果按下键,则主线程唤醒循环线程,如果没有按下,则主线程挂起循环线程。看看:

#include<windows.h>
#include<iostream>

using namespace std;

bool running = false;

DWORD WINAPI thread(LPVOID arg)
{
    while (1)
    {
        cout << "Hello world" << endl;
    }
}

void controlThread(void)
{
    short keystate = GetAsyncKeyState(VK_TAB);
    if(!running && keystate < 0)
    {
        ResumeThread(h_thread);
        running = true;
    }
    else if(running && keystate >= 0)
    {
        SuspendThread(h_thread);
        running = false;
    }
}
int main(void)
{
    HANDLE h_thread;

    h_thread = CreateThread(NULL,0,thread,NULL,0,NULL);
    SuspendThread(h_thread);

    while(1)
    {
        controlThread();    
        //To not consume too many processing resources.
        Sleep(200);
    }
}

我的主要使用一个循环来继续检查按键...但你可以在程序的特定点上做到这一点,避免无限循环。