删除键按历史记录(GetKeyState)C ++

时间:2013-11-26 16:14:12

标签: c++

当我用GetKeyState或GetAsyncKeyState按某些键时,我都有一个问题,它都记录了按键的历史记录。所以当我有一个cin>>这是我按下的键。

if(GetKeyState('1'))
            {
                //do stuff
                while(GetAsyncKeyState('1'));
            }

            if(GetAsyncKeyState('2'))
            {
                //do other stuff

                while(GetAsyncKeyState('2'));
            }

            if(GetAsyncKeyState('3'))
            {

                cout<<"Did you press 1? (y/n)"<<endl;
                cin>>answ;
                if(answ=='y')
                {
                    //do stuff
                }


                while(GetAsyncKeyState('3'));
            }

这就是我所拥有的:

Did you press 1?(y/n)

11223_

如何删除按下按键的历史记录?

1 个答案:

答案 0 :(得分:2)

我之前确实遇到过这个问题。首先,您不应该在控制台中使用混合输入(例如“stdio.h”和“conio.h”和“iostream”和“windows”)。在你的情况下,我会去Windows控制台(MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073(v=vs.85).aspx) 但正如你可能想的那样,我也很懒,而且我为此做了一个解决方法,这是代码:

void ClearConsoleInputBuffer()
{
    // If you happen to have any trouble clearing already cleared buffer, uncomment the section below.
    /* keybd_event('S', 0, 0, 0);
    keybd_event('S', 0,KEYEVENTF_KEYUP, 0);
    keybd_event(VK_BACK, 0, 0, 0);
    keybd_event(VK_BACK, 0,KEYEVENTF_KEYUP, 0); */
    PINPUT_RECORD ClearingVar1 = new INPUT_RECORD[256];
    DWORD ClearingVar2;
    ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),ClearingVar1,256,&ClearingVar2);
    delete[] ClearingVar1;
}

现在,它做了什么?在控制台中键入字符时,它们都存储在控制台缓冲区中。当您编写cin >> variable;时,实际上您不是直接从用户获取字符,而是从缓冲区获取字符。 让我举个例子:

#include "windows.h"
#include "iostream"

using namespace std;

int main()
{
cout << "write something";
Sleep(10000);
int input;
cin >> input;
}

您会注意到,当您输入字符时,即使没有调用cin,也会存储您的按键。

现在想象一下当你按下键而没有使用`cin'处理它们时会发生什么。他们会留在缓冲区。你应该避免这种情况。但是你可以在开始之前使用我上面提到的代码来清除控制台缓冲区(例子如下):

#include "windows.h"
#include "iostream"

using namespace std;

void ClearConsoleInputBuffer()
    {
        PINPUT_RECORD ClearingVar1 = new INPUT_RECORD[256];
        DWORD ClearingVar2;
        ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),ClearingVar1,256,&ClearingVar2);
        delete[] ClearingVar1;
    }

int main()
{
    cout << "write something";
    Sleep(3000);

    ClearConsoleInputBuffer();

    int a;
    cin >> a;
}