Die TAB-TASTE, Pfeiltasten und Zugriffstasten funktionieren nicht wie erwartet, wenn ein ActiveX-Steuerelement das übergeordnete Fenster eines nicht modalen Dialogfelds oder des ein Propertysheet-Fenster ist

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 187988 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn ein ActiveX-Steuerelement das übergeordnete Fenster eines nicht modalen Dialogfelds oder Propertysheet Fenster ist, erwartungsgemäß nicht die TAB-TASTE, Pfeiltasten und Zugriffstasten. Die TAB-Taste nicht Eingabe Fokus von einem Steuerelement zu einem anderen verschoben werden. Drücken der Pfeiltasten oder die Zugriffstasten im nicht modalen Dialogfeld Feld oder Propertysheet hat Fenster keine Auswirkungen.

Ursache

Das Problem ist das Steuerelement die Meldungsverteilschleife eigene nicht. Das Nachrichtensystem ist im Besitz der Containeranwendung. Daher werden alle Tastenanschläge Nachrichten wird von der Containeranwendung und nicht auf das nicht modale Dialogfeld Feld oder Propertysheet-Fenster verteilt.

Das Problem tritt nicht mit einem modalen Dialog Feld-Propertysheet-Fenster auf, da das Nachrichtensystem ist im Besitz des Dialogfeld-Feld-Managers und ihn übernimmt alle Tastenanschläge Nachrichten zu verarbeiten.

Lösung

Installieren Sie einen Windows-WH_GETMESSAGE-Hook für die nicht modales Dialogfeld Feld/Propertysheet abgeleitete Klasse, um Tastenanschläge abfangen und Behandeln von Zugriffstasten ermöglichen.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

Das folgende Beispiel zeigt eine Möglichkeit, die Windows-Installation Nachricht Hook auf eine nicht modale CPropertySheet abgeleitete Klasse:

Beispielcode

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

   }
				

Schritte zum Reproduzieren des Problems

  1. Wählen Sie die MFC-ActiveX-Assistent zum Erstellen eines ActiveX-Steuerelement. Akzeptieren Sie alle Standardeinstellungen.
  2. Zeigen Sie ein nicht modales Dialogfeld Feld oder Propertysheet Fenster an, wenn innerhalb des Steuerelements auf doppelklicken.
Ergebnisse : Wenn das Fenster nicht modales Dialogfeld Feld oder Propertysheet angezeigt wird, durch Drücken der TAB-TASTE bzw. der Zugriffstasten hat keine Auswirkungen.

Informationsquellen

(c) 1998 Microsoft Corporation, alle Rechte vorbehalten. Beiträge von Yeong Kah TAM, Microsoft Corporation.

Eigenschaften

Artikel-ID: 187988 - Geändert am: Dienstag, 21. November 2006 - Version: 6.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Foundation Class Library 4.2, wenn verwendet mit:
    • 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
Keywords: 
kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 187988
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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