在做一个键盘测试demo时需要区分一些复合键。比如在数字键区当Num按下和按上时按键是不一样的,但是它们和其它区的按键是相同的,比如Ins,Del,上,下左右或者是翻页。通过测试发现KBDLLHOOKSTRUCT里有一个flags标记,它可以区分按键。上代码,
std::map<int, int> idlist = {
{VK_END,VK_NUMPAD1},
{VK_RETURN,313},
{VK_UP,VK_NUMPAD8},
{VK_DOWN,VK_NUMPAD2},
{VK_LEFT,VK_NUMPAD4},
{VK_RIGHT,VK_NUMPAD6},
{VK_INSERT,VK_NUMPAD0},
{VK_DELETE,VK_DECIMAL},
{VK_NEXT,VK_NUMPAD3},
{VK_PRIOR,VK_NUMPAD9},
{VK_CLEAR,VK_NUMPAD5},
{VK_HOME,VK_NUMPAD7}
};
int GetKeyID(int vkcode, DWORD flag)
{
if ((flag & 0x01) == 0)
{
auto ite = idlist.find(vkcode);
if (ite != idlist.end())
return ite->second;
}
return vkcode;
}
这样使用GetKeyID就可以获取到实际的键盘ID。当然有一个特殊的按键小键盘区的回车,它和大键盘区的回车是一样的,所以我得新定义了一个313的ID,来代表大键盘区的按键。这样即可区分出它们。