Question

J'ai une boîte de dialogue qui permet aux utilisateurs de définir des raccourcis clavier à utiliser dans un programme 3D sous Windows. J'utilise CHotKeyCtrl, ce qui est très bon, mais ne gère pas certaines touches que les utilisateurs aimeraient utiliser - en particulier, tabulation et espace.

La gestion des touches de raccourci est suffisamment intelligente pour pouvoir utiliser ces touches. J'ai juste besoin d’une interface utilisateur pour les configurer. Un contrôle similaire à CHotKeyCtrl serait idéal, mais d’autres solutions de contournement sont également appréciées.

Était-ce utile?

La solution

Une solution de contournement consisterait à utiliser un contrôle d’édition standard avec une fonction de renvoi de message.

Cela vous permettrait d'intercepter les messages du clavier WM_KEYDOWN envoyés à ce contrôle de saisie.

La fonction de hook ressemblerait à quelque chose comme ceci:

    LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPMSG lpMsg)
    {
      LRESULT lResult = 0;

      if ((code >= 0) && (code == MSGF_DIALOGBOX))
      {
        if (lpMsg->message == WM_KEYDOWN)
        {
          //-- process the key down message
          lResult = 1;
        }
      }

      // do default processing if required
      if (lResult == 0)
      {
        lResult = CallNextHookEx(MessageFilterHook, code, wParam, (LPARAM)lpMsg);
      }

      return lResult;
    }

Le crochet peut ensuite être associé au contrôle de saisie lorsque celui-ci est activé, comme suit:

    //-- create an instance thunk for our hook callback
    FARPROC FilterProc = (FARPROC) MakeProcInstance((HOOKPROC)(MessageHook),
                                                    hInstance);
    //-- attach the message hook
    FilterHook = SetWindowsHookEx(WH_MSGFILTER, 
                                 (HOOKPROC)FilterProc, 
                                  hInstance, GetCurrentThreadId());

et supprimé lorsque le contrôle de saisie perd le focus de la manière suivante:

    //-- remove a message hook
    UnhookWindowsHookEx(MessageFilterHook);

En utilisant cette approche, chaque pression sur une touche est envoyée au crochet, à condition que le contrôle de modification ait le focus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top