A chave TAB, teclas de direção e teclas aceleradoras não funcionam como esperado quando um controle ActiveX é a janela pai de uma caixa de diálogo sem janela restrita ou de uma janela propertysheet

Traduções deste artigo Traduções deste artigo
ID do artigo: 187988 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando um controle ActiveX é a janela pai de uma caixa de diálogo sem janela restrita ou propertysheet janela, a chave TAB, teclas de direção e teclas aceleradoras não funcionam conforme o esperado. A tecla TAB não mover o foco de entrada de um controle para outro. Pressionar teclas de direção ou teclas de aceleração na caixa de diálogo sem janela restrita ou propertysheet janela tem efeito.

Causa

O problema é que o controle ActiveX não possui a bomba de mensagem. A bomba de mensagem é de propriedade do aplicativo recipiente. Portanto, todas as mensagens de pressionamento de tecla obtidas pelo aplicativo recipiente e não distribuídas para a janela propertysheet ou caixa de diálogo sem janela restrita.

O problema não ocorre com uma janela de propertysheet/caixa de diálogo modal porque o Gerenciador de caixa de diálogo pertence a bomba de mensagem e ele se encarrega de tratamento de todas as mensagens de pressionamento de tecla.

Resolução

Instale um gancho WH_GETMESSAGE do Windows para a classe caixa/propertysheet derivado de diálogo sem janela restrita permitir que ele interceptar pressionamentos de teclas e manipular aceleradores.

Situação

Esse comportamento é por design.

Mais Informações

O exemplo a seguir mostra uma forma para instalar o Windows gancho de mensagem para uma classe derivada de CPropertySheet sem janela restrita:

Código de exemplo

   // Handle to the Windows Message hook. It can be a global variable or a
   // member variable in your CPropertySheet-derived class.
   HHOOK hHook = NULL;



   // Hook procedure for WH_GETMESSAGE hook type.
   LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
   {
      // Switch the module state for the correct handle to be used.
      AFX_MANAGE_STATE(AfxGetStaticModuleState( ));



      // If this is a keystrokes message, translate it in controls'
      // PreTranslateMessage().
      LPMSG lpMsg = (LPMSG) lParam;
      if( (nCode >= 0) &&
         PM_REMOVE == wParam &&
         (lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) &&
         AfxGetApp()->PreTranslateMessage((LPMSG)lParam) )
         {
         // The value returned from this hookproc is ignored, and it cannot
         // be used to tell Windows the message has been handled. To avoid
         // further processing, convert the message to WM_NULL before
         // returning.
         lpMsg->message = WM_NULL;
         lpMsg->lParam = 0L;
         lpMsg->wParam = 0;
         }



      // Passes the hook information to the next hook procedure in
      // the current hook chain.
      return ::CallNextHookEx(hHook, nCode, wParam, lParam);
   }



   // Declare and define the following two functions:
   BOOL CModelessPropertySheet::OnInitDialog()
   {
      CPropertySheet::OnInitDialog();

      // Install the WH_GETMESSAGE hook function.
      hHook = ::SetWindowsHookEx(
         WH_GETMESSAGE,
         GetMessageProc,
         AfxGetInstanceHandle(),
         GetCurrentThreadId());
      ASSERT (hHook);



      return TRUE;   // Return TRUE unless you set the focus to a control.
                     // EXCEPTION: OCX Property Pages should return FALSE.


   }



   void CModelessPropertySheet::OnClose()
   {
      // Uninstall the WH_GETMESSAGE hook function.
      VERIFY (::UnhookWindowsHookEx (hHook));



      CPropertySheet::OnClose();

   }
				

Etapas para reproduzir o problema

  1. Selecione o WebAssistente de ActiveX MFC para criar um ActiveX controle. Aceite todas as configurações padrão.
  2. Exiba uma janela de propertysheet ou caixa de diálogo sem janela restrita quando clicar duas vezes dentro do controle.
resultados : quando a janela propertysheet ou caixa de diálogo sem janela restrita é mostrada, pressionando a tecla TAB ou teclas de aceleração não tem efeito.

Referências

(c) Microsoft Corporation 1998, todos os direitos reservados. Contribuições de Yeong Kah TAM, Microsoft Corporation.

Propriedades

ID do artigo: 187988 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 6.1
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 187988

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com