Partager via


Désactivation des touches de raccourci dans les jeux

Cet article explique comment désactiver temporairement les raccourcis clavier dans Microsoft Windows afin d’éviter toute interruption du jeu pour les jeux en plein écran. Les touches Maj et Ctrl sont souvent utilisées comme boutons d’exécution ou d’exécution dans les jeux. Si les utilisateurs appuient accidentellement sur la touche Windows (située à proximité de ces touches), ils peuvent se faire soudainement sauter hors de l’application, ce qui ruine l’expérience de jeu. Le simple fait d’utiliser la touche Maj comme bouton de jeu peut exécuter par inadvertance le raccourci StickyKeys qui peut afficher une boîte de dialogue d’avertissement. Pour éviter ces problèmes, vous devez désactiver ces clés lors de l’exécution en mode plein écran, et soit réactiver les clés sur leurs gestionnaires par défaut lors de l’exécution en mode fenêtré, soit quitter l’application.

Cet article explique comment effectuer les opérations suivantes :

Désactiver la touche Windows avec un crochet de clavier

Utilisez un crochet de clavier de bas niveau pour filtrer le traitement de la touche Windows . Le crochet clavier de bas niveau indiqué dans l’exemple 1 reste en vigueur même si un utilisateur réduit la fenêtre ou bascule vers une autre application. Cela signifie que vous devez veiller à ce que la clé Windows ne soit pas désactivée lorsque l’application est désactivée. Le code de l’exemple 1 le fait en gérant le message WM_ACTIVATEAPP.

Notes

Cette méthode fonctionne sur Windows 2000 et versions ultérieures de Windows. Cette méthode fonctionne également avec les comptes d’utilisateur avec privilèges minimum (également appelés comptes d’utilisateur standard).

 

Cette méthode est utilisée par DXUT et est illustrée dans l’exemple de code suivant.

Exemple 1. Utilisation d’un crochet de clavier de bas niveau pour désactiver la touche Windows

HHOOK g_hKeyboardHook = nullptr;
bool g_bWindowActive = false;
bool g_bFullscreen;
 
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
    // Initialization
    g_hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(nullptr), 0 );
 
    // 
    // main application code here
    // 
 
    // Cleanup before shutdown
    UnhookWindowsHookEx( g_hKeyboardHook );
    g_hKeyboardHook = nullptr;
    
    return 0;
}
 
 
LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
    if (nCode < 0 || nCode != HC_ACTION )  // do not process message 
        return CallNextHookEx( g_hKeyboardHook, nCode, wParam, lParam); 
 
    bool bEatKeystroke = false;
    auto p = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
    switch (wParam) 
    {
        case WM_KEYDOWN:  
        case WM_KEYUP:    
        {
            bEatKeystroke = (g_bFullscreen && g_bWindowActive && ((p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN)));
            // Note that this will not block the Xbox Game Bar hotkeys (Win+G, Win+Alt+R, etc.)
            break;
        }
    }
 
    if( bEatKeystroke )
        return 1;
    else
        return CallNextHookEx( g_hKeyboardHook, nCode, wParam, lParam );
}
 
 
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch( uMsg )
    {
       case WM_ACTIVATEAPP:
            // g_bWindowActive is used to control if the Windows key is filtered by the keyboard hook or not.
            if( wParam )
                g_bWindowActive = true;           
            else 
                g_bWindowActive = false;           
            break;
            
        case WM_SYSKEYDOWN:
            if (wParam == VK_RETURN && (lParam & 0x60000000) == 0x20000000)
            {
                // Implement the classic ALT+ENTER fullscreen toggle
             ...
                // g_bFullscreen is used to control if the Windows key is filtered by the keyboard hook or not.
                g_bFullscreen = !g_bFullscreen;                
                
                // Remember to use DXGI_MWA_NO_ALT_ENTER when you call the DXGI method MakeWindowAssociation
                // so you control the fullscreen toggling in your application.
            }
            break;
    }
}

Désactiver les touches de raccourci d’accessibilité

Windows inclut des fonctionnalités d’accessibilité telles que StickyKeys, FilterKeys et ToggleKeys (voir Accessibilité de Windows). Chacun d’entre eux a un objectif différent; StickyKeys, par exemple, est conçu pour les personnes qui ont des difficultés à maintenir simultanément deux touches ou plus. Chacune de ces fonctionnalités d’accessibilité dispose également d’un raccourci clavier qui permet d’activer ou de désactiver la fonctionnalité. Par exemple, le raccourci StickyKeys est déclenché en appuyant cinq fois sur la touche Maj . Si la touche MAJ est également utilisée dans le jeu, l’utilisateur peut déclencher accidentellement ce raccourci pendant la partie. Lorsque le raccourci est déclenché, Windows (par défaut) affiche un avertissement dans une boîte de dialogue, ce qui empêcherait Windows de réduire l’exécution d’un jeu en mode plein écran. Cela, bien sûr, peut avoir un effet radical sur le jeu.

Les fonctionnalités d’accessibilité sont requises pour certains clients et n’interfèrent pas elles-mêmes avec les jeux en plein écran; Par conséquent, vous ne devez pas modifier les paramètres d’accessibilité. Toutefois, étant donné que les raccourcis pour les fonctionnalités d’accessibilité peuvent perturber le jeu s’ils sont déclenchés accidentellement, vous devez désactiver un raccourci d’accessibilité uniquement lorsque cette fonctionnalité n’est pas activée en appelant SystemParametersInfo.

Un raccourci d’accessibilité désactivé par SystemParametersInfo reste désactivé même après la fermeture de l’application. Cela signifie que vous devez restaurer les paramètres avant de quitter l’application. Étant donné qu’il est possible que l’application ne se quitte pas correctement, vous devez écrire ces paramètres dans le stockage persistant afin qu’ils puissent être restaurés lorsque l’application est réexécuter. Vous pouvez également utiliser un gestionnaire d’exceptions pour restaurer ces paramètres en cas de plantage.

Pour désactiver ces raccourcis

  1. Capturez les paramètres d’accessibilité actuels avant de les désactiver.
  2. Désactivez le raccourci d’accessibilité lorsque l’application passe en mode plein écran si la fonctionnalité d’accessibilité est désactivée.
  3. Restaurez les paramètres d’accessibilité lorsque l’application passe en mode fenêtré ou se ferme.

Cette méthode est utilisée dans DXUT et est illustrée dans l’exemple de code suivant.

Notes

Cette méthode fonctionne lors de l’exécution sur un compte d’utilisateur Standard.

 

Exemple 2. Désactivation des touches de raccourci d’accessibilité

STICKYKEYS g_StartupStickyKeys = {sizeof(STICKYKEYS), 0};
TOGGLEKEYS g_StartupToggleKeys = {sizeof(TOGGLEKEYS), 0};
FILTERKEYS g_StartupFilterKeys = {sizeof(FILTERKEYS), 0};    
 
 
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
    // Save the current sticky/toggle/filter key settings so they can be restored them later
    SystemParametersInfo(SPI_GETSTICKYKEYS, sizeof(STICKYKEYS), &g_StartupStickyKeys, 0);
    SystemParametersInfo(SPI_GETTOGGLEKEYS, sizeof(TOGGLEKEYS), &g_StartupToggleKeys, 0);
    SystemParametersInfo(SPI_GETFILTERKEYS, sizeof(FILTERKEYS), &g_StartupFilterKeys, 0);
 
 ...
 
    // Disable when full screen
    AllowAccessibilityShortcutKeys( false );
 
 ...
 
    // Restore back when going to windowed or shutting down
    AllowAccessibilityShortcutKeys( true );
}
 
 
void AllowAccessibilityShortcutKeys( bool bAllowKeys )
{
    if( bAllowKeys )
    {
        // Restore StickyKeys/etc to original state and enable Windows key      
        STICKYKEYS sk = g_StartupStickyKeys;
        TOGGLEKEYS tk = g_StartupToggleKeys;
        FILTERKEYS fk = g_StartupFilterKeys;
        
        SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS), &g_StartupStickyKeys, 0);
        SystemParametersInfo(SPI_SETTOGGLEKEYS, sizeof(TOGGLEKEYS), &g_StartupToggleKeys, 0);
        SystemParametersInfo(SPI_SETFILTERKEYS, sizeof(FILTERKEYS), &g_StartupFilterKeys, 0);
    }
    else
    {
        // Disable StickyKeys/etc shortcuts but if the accessibility feature is on, 
        // then leave the settings alone as its probably being usefully used
 
        STICKYKEYS skOff = g_StartupStickyKeys;
        if( (skOff.dwFlags & SKF_STICKYKEYSON) == 0 )
        {
            // Disable the hotkey and the confirmation
            skOff.dwFlags &= ~SKF_HOTKEYACTIVE;
            skOff.dwFlags &= ~SKF_CONFIRMHOTKEY;
 
            SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS), &skOff, 0);
        }
 
        TOGGLEKEYS tkOff = g_StartupToggleKeys;
        if( (tkOff.dwFlags & TKF_TOGGLEKEYSON) == 0 )
        {
            // Disable the hotkey and the confirmation
            tkOff.dwFlags &= ~TKF_HOTKEYACTIVE;
            tkOff.dwFlags &= ~TKF_CONFIRMHOTKEY;
 
            SystemParametersInfo(SPI_SETTOGGLEKEYS, sizeof(TOGGLEKEYS), &tkOff, 0);
        }
 
        FILTERKEYS fkOff = g_StartupFilterKeys;
        if( (fkOff.dwFlags & FKF_FILTERKEYSON) == 0 )
        {
            // Disable the hotkey and the confirmation
            fkOff.dwFlags &= ~FKF_HOTKEYACTIVE;
            fkOff.dwFlags &= ~FKF_CONFIRMHOTKEY;
 
            SystemParametersInfo(SPI_SETFILTERKEYS, sizeof(FILTERKEYS), &fkOff, 0);
        }
    }
}