高效的永久 Numlock 键状态检查

Efficient Perpetual Numlock Keystate Check

我买了一个非常好的键盘 (logitech G915),不管出于什么愚蠢的原因,它都没有数字锁定指示器。因此,我正在使用 Logitech 的照明 SDK 来使用按键的 rgb 背光自己制作功能。

我有一个非常简单的控制台概念验证:

    while (true)
    {
        if (GetKeyState(VK_NUMLOCK) & 0x1)
            LogiLedSetLightingForKeyWithKeyName(LogiLed::KeyName::NUM_LOCK, 0, 100, 100);
        else
            LogiLedSetLightingForKeyWithKeyName(LogiLed::KeyName::NUM_LOCK, 0, 0, 0);
    }

但我认为用一个永久的 while 循环来耗尽 cpu 个循环对于这么小的功能来说并不是一件好事。我应该让它休眠一段时间(建议的长度?)还是有办法休眠直到系统获得 numlock 状态更改,或者我只是在解决这个问题?

此外,我还没有研究它,但我想把它做成后台进程或托盘应用程序(没关系,只是隐藏起来)所以我想答案应该考虑到这个限制,如果是一个。

谢谢!

在应用程序启动时,使用 GetAsyncKeyState() 而不是 GetKeyState() 来获取按键的当前状态并相应地更新灯光。

然后,使用SetWindowsHookEx() to install a global WH_KEYBOARD_LL hook来检测之后是否按下该键。在每个回调事件上,使用钩子提供的状态信息,或在钩子回调退出后立即启动异步任务以获取当前键状态(因为调用回调时 GetAsyncKeyState() 尚未更新),然后相应地更新灯光。

或者,在每次按键时使用 Raw Input API to monitor the keyboard and receive WM_INPUT window 消息。然后获取钥匙的当前状态并相应地更新灯光。