2013-11-26 152 views
1

我有一个问题,当我用GetKeyState或GetAsyncKeyState按下某些键都记录按键的历史记录。所以当我有一个cin >>这里是我按下的键。删除按键历史记录(GetKeyState)C++

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_ 

如何删除我的钥匙史上按下按钮?

+0

您想完成什么? –

+0

这是一个简单的计数器。当我按1.它简单地添加到一个整数+1。当2到另一个整数。如:1.呼叫2.已回答 –

+0

这些功能用于GUI应用程序。当您从Windows队列中获取键盘输入消息时,您可以调用GetKeyState。他们不与iostreams混合。 –

回答

1

我以前真的有这个问题。首先,你不应该在控制台中使用混合输入(例如“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; 
} 
+0

精彩!!!!! – Shlublu