A chave TAB, teclas de setas e teclas de atalho não funcionam como previsto quando um controlo ActiveX é a janela principal de uma caixa de diálogo não modal ou de uma janela propertysheet

Traduções de Artigos Traduções de Artigos
Artigo: 187988 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando um controlo ActiveX é a janela principal de uma caixa de diálogo não modal ou propertysheet janela, a chave TAB, teclas de setas e teclas de atalho não funcionam como previsto. A tecla TAB não move o foco de entrada de um controlo para outro. Premir as teclas de seta ou combinações de teclas na caixa de diálogo não modal ou propertysheet janela tem efeito.

Causa

O problema é que o controlo ActiveX não possui a Bomba de mensagem. Bomba mensagem pertence a aplicação de contentor. Por conseguinte, todas as mensagens a combinação de teclas são seguidas por aplicações contentor e não emitir para a janela propertysheet ou de caixa de diálogo não modal.

O problema não ocorre com uma janela de propertysheet/caixa de diálogo modal porque Bomba mensagem pertence o Gestor de caixa de diálogo e encarrega-se de processar todas as mensagens batimento de tecla.

Resolução

Instale uma rotina WH_GETMESSAGE do Windows para a classe caixa/propertysheet derivado de diálogo não modal permitir que interceptar os batimentos de teclas e processar aceleradores.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

O exemplo seguinte mostra uma forma de instalar o Windows rotina de mensagem a uma classe derivada de CPropertySheet não modal:

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

   }
				

Passos para reproduzir o problema

  1. Seleccione ControlWizard de ActiveX MFC para criar um ActiveX controlo. Aceite todas as predefinições.
  2. Apresenta uma janela de propertysheet ou de caixa de diálogo não modal quando fazendo duplo clique no interior do controlo.
resultados : quando for apresentada a janela de caixa ou propertysheet diálogo não modal, premindo a tecla TAB ou teclas de atalho não tem efeito.

Referências

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

Propriedades

Artigo: 187988 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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