最近在游戏开发中遇到这样的需求:玩家需要不停的连击shift键。
大家都知道,在windows下默认连击shift键到5次会弹出粘滞键设置的对话框,如下图所示。
在游戏中必须屏蔽windows对粘滞键热键的反应,否则游戏体验将会非常差。在网上查找一段时间后发现,关于如何通过程序屏蔽粘滞键热键的中文资料非常少,大多数的答案都是打开“控制面板”,然后找到“辅助功能选项”条目云云,这显示不是程序员所需要的解决手法。
经过多方查找,问题最终得以解决。下面列表代码,以飨未来者,程序VC6.0+XP系统下运行通过。
// activate or inactivate sticky keys hot key (pop up a set up dialog after continually pressed shift 5 times)
bool ActivateStickyHotkey(bool isActivate, bool* pIsPreviouslyActivate= NULL)
{
// fetch current sticky keys state
STICKYKEYS skf;
const DWORD datasize = sizeof(STICKYKEYS);
skf.cbSize = datasize;
if (!SystemParametersInfo(SPI_GETSTICKYKEYS, datasize, (LPVOID)&skf, 0))
{
return false;
}
const bool isPreviouslyActivate = (skf.dwFlags & SKF_HOTKEYACTIVE) != 0;
// store old sticky keys state
if (NULL!= pIsPreviouslyActivate)
{
*pIsPreviouslyActivate = isPreviouslyActivate;
}
// return true if no need to change state
if (isActivate==isPreviouslyActivate)
{
return true;
}
// change sticky keys state
skf.dwFlags = isActivate? (skf.dwFlags | SKF_HOTKEYACTIVE) : (skf.dwFlags & (~SKF_HOTKEYACTIVE));
const bool isSuccess = TRUE==SystemParametersInfo(SPI_SETSTICKYKEYS, datasize, (LPVOID)&skf, 0);
return isSuccess;
}
参考资料:
1,
http://msdn.microsoft.com/en-us/library/aa925903.aspx 2,
http://stackoverflow.com/questions/734618/disabling-accessibility-shortcuts-in-net-application