La clave TAB, teclas de dirección y teclas de aceleración no funcionan como se esperaba cuando un control ActiveX es la ventana primaria de un cuadro de diálogo no modal o de una ventana propertysheet

Seleccione idioma Seleccione idioma
Id. de artículo: 187988 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando un control ActiveX es la ventana primaria de un cuadro de diálogo no modal o ventana propertysheet, la clave TAB, teclas de dirección y teclas de aceleración no funcionan como se esperaba. La tecla TAB no mover el foco de entrada de un control a otro. Presionar las teclas de flecha o teclas de aceleración en el cuadro de diálogo no modal o propertysheet ventana no tiene ningún efecto.

Causa

El problema es que el control ActiveX no posee el suministro de mensajes. El suministro de mensajes es propiedad de la aplicación contenedora. Por tanto, todos los mensajes de pulsación de tecla son realizados por la aplicación contenedora y no distribuir a la ventana propertysheet o de cuadro de diálogo no modal.

El problema no se produce con una ventana de propertysheet/cuadro de diálogo modal porque el suministro de mensajes es propiedad el administrador del cuadro de diálogo y se ocupa de controlar todos los mensajes de pulsación de tecla.

Solución

Instalar un enlace WH_GETMESSAGE de Windows para que le permiten interceptar pulsaciones de teclas y controlar los aceleradores de la clase de cuadro/propertysheet derivada diálogo no modal.

Estado

Este comportamiento es por diseño.

Más información

En el siguiente ejemplo muestra una manera instalar el Windows enlace de mensaje a una clase derivada de CPropertySheet no modal:

Código de ejemplo

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

   }
				

Pasos para reproducir el problema

  1. Seleccione el ControlWizard de ActiveX de MFC para crear un control ActiveX control. Aceptar todos los valores predeterminados.
  2. Mostrar una ventana de propertysheet o de cuadro de diálogo no modal al hacer doble clic dentro del control.
resultados : cuando se muestra la ventana de propertysheet o de cuadro de diálogo no modal, presionar la tecla TAB o teclas de aceleración no tiene efecto.

Referencias

(c) 1998 Microsoft Corporation, reservados todos los derechos. Contribuciones por Yeong Kah TAM, Microsoft Corporation.

Propiedades

Id. de artículo: 187988 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 6.1
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes 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
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard
    • Microsoft Visual C++ .NET 2003 Standard
Palabras clave: 
kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 187988

Enviar comentarios

 

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