清风竹林

ぷ雪飘绛梅映残红
   ぷ花舞霜飞映苍松
     ----- Do more,suffer less

如何通过程序屏蔽windows粘滞键之热键

    最近在游戏开发中遇到这样的需求:玩家需要不停的连击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

posted on 2010-03-04 13:36 李现民 阅读(4562) 评论(1)  编辑 收藏 引用 所属分类: minitoolsVC

评论

# re: 如何通过程序屏蔽windows粘滞键之热键 2014-01-21 09:41 张耀光

在windows下默认连击shift键到5次会弹出粘滞键设置的对话框  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理