读键盘状态

时间:2014-06-28 07:36:33

标签: c winapi console keyboard

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

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

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

那我怎么能

  • 通过某些API读取键盘键的RAW状态? (但在短时间内连续读取之间必须保持一致)。
  • 或者.NET等同于KEY_UP,KEY_DOWN事件(或消息,回调,c中可能的任何事件),我可以编写一个小包装器,以便我不必更改FSM逻辑。

我对可用的Windows API了解有限,无法解决手头的任务。我主要是一个嵌入式/ C#家伙,无论是裸机(开发固件)还是使用.net框架(开发Windows时)。

2 个答案:

答案 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)

感谢大家的努力和帮助。我发帖并接受这个作为答案。谁知道这可能会帮助那些正在努力解决同样问题的人。