最近在游戲開發(fā)中遇到這樣的需求:玩家需要不停的連擊shift鍵。
大家都知道,在windows下默認(rèn)連擊shift鍵到5次會(huì)彈出粘滯鍵設(shè)置的對話框,如下圖所示。

在游戲中必須屏蔽windows對粘滯鍵熱鍵的反應(yīng),否則游戲體驗(yàn)將會(huì)非常差。在網(wǎng)上查找一段時(shí)間后發(fā)現(xiàn),關(guān)于如何通過程序屏蔽粘滯鍵熱鍵的中文資料非常少,大多數(shù)的答案都是打開“控制面板”,然后找到“輔助功能選項(xiàng)”條目云云,這顯示不是程序員所需要的解決手法。
經(jīng)過多方查找,問題最終得以解決。下面列表代碼,以饗未來者,程序VC6.0+XP系統(tǒng)下運(yùn)行通過。
// 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