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

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
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
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.

ocx kbcodesam fichas enlaces dll mfcdll

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 187988 - Última revisión: 12/05/2015 08:49:24 - Revisión: 6.1

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtes
Comentarios