Pergunta

Eu tenho uma caixa de diálogo que permite aos usuários hotkeys definido para ser usado em um programa 3D em janelas. Estou usando CHotKeyCtrl, que é muito bom, mas não lida com algumas chaves que os usuários gostariam de usar -. Especificamente, guia e espaço

A manipulação atalho é inteligente o suficiente para ser capaz de fogo sobre essas chaves, eu só preciso de uma interface de usuário para deixá-los ser definido. Um controle semelhante ao CHotKeyCtrl seria o ideal, mas outras soluções também são apreciados.

Foi útil?

Solução

Uma opção soluções alternativas seria a utilização de um estoque de controle de edição padrão com uma função de mensagem gancho.

Isso permitirá que você para interceptar o teclado WM_KEYDOWN mensagens enviadas para que o controle de edição.

A função de gancho seria algo parecido com isto:

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

O gancho pode então ser anexado ao controle de edição quando o controle de edição recebe o foco da seguinte forma:

    //-- 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 removido quando o controle de edição quando perde o foco da seguinte forma:

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

Usando essa abordagem a cada tecla pressionada será enviado para o gancho, desde o controle de edição tem foco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top