La touche TAB, touches de direction et les touches d'accès rapide ne fonctionnent pas comme prévu lorsqu'un contrôle ActiveX est la fenêtre parente d'une boîte de dialogue non modale ou d'une fenêtre propertysheet

Traductions disponibles Traductions disponibles
Numéro d'article: 187988 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsqu'un contrôle ActiveX est la fenêtre de parent d'une boîte de dialogue non modales ou fenêtre propertysheet, la touche TAB, touches de direction et les touches d'accès rapide ne fonctionnent pas de la façon attendue. La touche TAB n'a pas déplacer le focus d'entrée d'un contrôle à un autre. En appuyant sur les touches de direction ou touches accélérateur dans la boîte de dialogue non modale ou un propertysheet fenêtre n'a aucun effet.

Cause

Le problème est que le contrôle ActiveX n'est pas propriétaire de la pompe de messages. La pompe de messages est détenue par l'application conteneur. Par conséquent, tous les messages de séquence de touches sont prises par l'application conteneur et ne pas expédiés vers la fenêtre de boîte ou propertysheet boîte de dialogue non modale.

Le problème ne se produit pas avec une fenêtre propertysheet/boîte de dialogue modale car la pompe de messages appartenant au Gestionnaire de boîte de dialogue, et il se charge de gestion des tous les messages de séquence de touches.

Résolution

Installer un hook Windows WH_GETMESSAGE pour la classe de zone/propertysheet dérivée de boîte de dialogue non modale afin qu'il puisse intercepter les frappes de touches et gérer des accélérateurs.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

L'exemple suivant illustre une méthode pour installer Windows message hook pour une classe dérivée de CPropertySheet non modale :

Exemple de code

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

   }
				

Procédure pour reproduire le problème.

  1. Sélectionnez le ControlWizard ActiveX MFC pour créer un ActiveX contrôle. Acceptez tous les paramètres par défaut.
  2. Afficher une fenêtre de zone ou propertysheet boîte de dialogue non modale lorsque vous double-cliquez sur l'intérieur du contrôle.
RESULTS : lorsque la fenêtre de zone ou propertysheet boîte de dialogue non modale est affichée, appuyant sur la touche TAB ou les touches accélérateur n'a aucun effet.

Références

(c) 1998 Microsoft Corporation, tous droits réservés. Contribution de Yeong-Kah TAM, Microsoft Corporation.

Propriétés

Numéro d'article: 187988 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 6.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Foundation Class Library 4.2 sur le système suivant
    • Microsoft Visual C++ 4.2 Édition Entreprise
    • Microsoft Visual C++ 4.2 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 4.2 Édition Professionnelle
    • Microsoft Visual C++ 4.2 Édition Professionnelle
    • Microsoft Visual C++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Initiation
    • Microsoft Visual C++ .NET 2003 Initiation
Mots-clés : 
kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 187988
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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