Domanda

Ho una finestra di dialogo che consente agli utenti di impostare tasti di scelta rapida da utilizzare in un programma 3d su Windows. Sto usando CHotKeyCtrl, che è abbastanza buono, ma non gestisce alcuni tasti che gli utenti vorrebbero usare - in particolare, tab e spazio.

La gestione dei tasti di scelta rapida è abbastanza intelligente da poter sparare su quei tasti, ho solo bisogno di un'interfaccia utente per lasciarli impostati. Un controllo simile a CHotKeyCtrl sarebbe l'ideale, ma sono apprezzate anche altre soluzioni alternative.

È stato utile?

Soluzione

Un'opzione alternativa sarebbe quella di utilizzare un controllo di modifica standard di scorta con una funzione di hook messaggio.

Ciò ti consentirebbe di intercettare i messaggi della tastiera WM_KEYDOWN inviati a quel controllo di modifica.

La funzione hook sarebbe simile a questa:

    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;
    }

L'hook può quindi essere collegato al controllo di modifica quando il controllo di modifica viene attivato come segue:

    //-- 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());

e rimosso quando il controllo di modifica quando perde lo stato attivo come segue:

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

Usando questo approccio, ogni pressione del tasto verrà inviata all'hook, a condizione che il controllo di modifica sia attivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top