高效的永久 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 消息。然后获取钥匙的当前状态并相应地更新灯光。
我买了一个非常好的键盘 (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 消息。然后获取钥匙的当前状态并相应地更新灯光。