2014-06-28 92 views
3

我正在写一个c控制台应用程序(用于Windows平台,使用msC++编译器),它需要在很短的时间间隔(几毫秒的顺序)读取某些键盘按键的状态。读状态然后被馈送到FSM中,该FSM向应用逻辑的其余部分提供丰富的键事件(KEY_UP,KEY_RELEASED,KEY_DOWN,KEY_HELD_FOR_LONG_PERIOD等)。 (基本上将嵌入式应用程序移植到Windows平台)。阅读键盘状态

我不知道如何阅读关键状态,因此我谷歌搜索并遇到this答案。据我所知,它基本上扫描任何键(或鼠标)事件的控制台事件。

尽管提供的答案是一个很好的起点,但我面临的问题是在键盘状态的连续“读取”(以及连续读取之间的时间滞后小于50毫秒)之间,我得到不同的答案(在时间被按下,有时会被释放),即使按键仍然在物理上按下。这扰乱了FSM逻辑。但考虑到控制台在短时间内可能没有新的键盘事件,这可能是被接受的行为。不幸的是,这并没有解决我的问题。

所以,我怎么能

  • 通过一些API键盘按键的读取原始状态? (但在短时间帧内连续读取之间必须保持一致)。或者有相当于.NET的KEY_UP,KEY_DOWN类型的事件(或者消息,回调函数,可能在c中的任何东西),通过它我可以写一个小包装器,这样我就不必更改FSM逻辑。

我对可用的windows API有一定的了解,以解决手头的任务。我主要是一个嵌入式/ C#人,他们或者是裸机(开发固件时)或者使用.net框架(当为Windows开发时)。

+1

您可以从控制台输入缓冲区中获取按键和按键事件,如[本文所述](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms685035%28v = vs.85%29.aspx)。你可以合成其他事件(长键或其他)。 – arx

回答

0

在arx的建议之后,我回顾了API和键盘事件,发现它是我处理事件的设计,它给了我一个问题..我正在轮询事件,好像它们是'信号'为键的当前状态。相反的事件代表信号中的“变化”。

原来的设计是这样的:

if (there_is_an_event_for (KEY_A))  // i assumed that events represents a key high state 
    Update_fsm_for_KEY_A (with_high_signal); 
else 
    Update_fsm_for_KEY_A (with_low_signal); 

由于控制台获取在事件KEY_PRESSED和KEY_RELEASED,这样的设计是不恰当的。这是一个新的设计:

static bool last_key_state = false; 

if (there_is_a_key_pressed_event_for (KEY_A)) 
    last_key_state = true; 
else if (there_is_a_key_released_event_for (KEY_B)) 
    last_key_state = false; 

Update_fsm_for_KEY_A (last_key_state) 

谢谢大家为你的努力和帮助。我发布并接受这个答案。谁知道这可能会帮助那些在同样的问题上挣扎的人。

1

您可以使用GetAsyncKeyState或GetKeyboardState API读取原始键盘状态。