这是远从一个完整的解决方案,我不知道它将如何与PDCurses互动,但它是一种尝试:
总之,用GetStdHandle()
抓住控制台的手柄,用SetConsoleMode()
将其配置为原始读数,然后用ReadConsoleInput()
一次读取一个密钥。我使用std::set
来跟踪当前按下的键,因此忽略重复。
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <cassert>
#include <set>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE h=GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
BOOL success;
success=GetConsoleMode(h, &mode);
assert(success);
mode &= ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
mode |= ENABLE_WINDOW_INPUT;
success=SetConsoleMode(h, mode);
assert(success);
INPUT_RECORD buffer[10];
std::set<WORD> keys_down;
while (true)
{
DWORD count=0;
success=ReadConsoleInput(h, buffer, 10, &count);
if (!success)
{
continue;
}
for (size_t i=0;i<count;++i)
{
switch (buffer[i].EventType)
{
case KEY_EVENT:
{
WORD keycode=buffer[i].Event.KeyEvent.wVirtualKeyCode;
if (buffer[i].Event.KeyEvent.bKeyDown)
{
if (keys_down.find(keycode)==keys_down.end())
{
std::cout<<"Key down: "<<keycode<<std::endl;
keys_down.insert(keycode);
}
}
else
{
if (keys_down.find(keycode)!=keys_down.end())
{
std::cout<<"Key up:"<<keycode<<std::endl;
keys_down.erase(keycode);
}
}
break;
}
default:
break;
}
}
}
}
我想一个更有趣的问题是,“你怎么知道钥匙什么时候被释放? 'getch()'不会告诉你这一点。我怀疑这两个问题的答案都是一样的:设计你的输入法,所以这个烦恼并不重要。 – Managu 2012-02-02 01:14:46
那么你有解决方案吗?在win32控制台中完全避免键弹出的方法?因为我所能想到的所有输入方式都需要一个窗口(例如SDL,RAW输入,dinput) – 2012-02-02 01:39:47
我在想:“记住最近按下的按键,忽略按键” – Managu 2012-02-02 01:48:58