我正在编写一个c控制台应用程序(对于Windows平台,使用msc ++编译器),它需要在非常短的时间间隔(大约几毫秒)内读取某些键盘键的状态。然后将读取状态馈送到FSM,FSM向应用程序逻辑的其余部分提供丰富的键事件(KEY_UP,KEY_RELEASED,KEY_DOWN,KEY_HELD_FOR_LONG_PERIOD等)。 (基本上将嵌入式应用程序移植到Windows平台)。
我不知道如何阅读关键状态,因此我用Google搜索并遇到this回答。据我所知,它基本上扫描控制台事件中的任何键(或鼠标)事件。
虽然,提供的答案是一个很好的起点,但我面临的问题是在连续“读取”键盘状态之间(以及连续读取之间的时间间隔小于50毫秒),我得到不同的答案(有时按下,有时释放)即使钥匙仍然受到物理压力。这会混淆FSM逻辑。但考虑到控制台可能在如此短的时间内没有新的键盘事件,这可能是可接受的行为。不幸的是,这并没有解决我的问题。
那我怎么能
我对可用的Windows API了解有限,无法解决手头的任务。我主要是一个嵌入式/ C#家伙,无论是裸机(开发固件)还是使用.net框架(开发Windows时)。
答案 0 :(得分:1)
您可以使用GetAsyncKeyState或GetKeyboardState API读取原始键盘状态。
答案 1 :(得分: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)
感谢大家的努力和帮助。我发帖并接受这个作为答案。谁知道这可能会帮助那些正在努力解决同样问题的人。