Klíč TAB, klávesy se šipkami a klávesové zkratky nefungují očekávaným způsobem při ovládací prvek ActiveX je nadřazené okno nemodální dialogové okno nebo okno propertysheet

Překlady článku Překlady článku
ID článku: 187988 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Pokud ovládací prvek ActiveX je nadřazené okno nemodální dialogové okno nebo okno propertysheet, klíč TAB, klávesy se šipkami a klávesové zkratky nefungují podle očekávání. Klávesy TAB není vstupní fokus přesunout z jednoho ovládacího prvku do jiného. Stisknutím kláves se šipkami nebo klávesové zkratky v propertysheet nebo nemodální dialogové okno žádný účinek.

Příčina

Problém je ovládací prvek ActiveX nemá vlastní čerpadlo zpráv. Čerpadlo zpráv je vlastněna aplikace kontejneru. Proto všechny zprávy úhoz převzaty aplikace kontejneru a není odesílán nemodální dialogové okno pole nebo propertysheet.

Problém s modální dialogové okno pole/propertysheet nedochází, protože zpráva čerpadlo vlastněných dialogové okno Správce pole a činnostem zpracování všech zpráv stisknutí klávesy.

Řešení

Nainstalovat Windows WH_GETMESSAGE zavěšení pro pole/propertysheet odvozené třídy nemodální dialogové okno Povolit ji zachytit úhozy a zpracovat akcelerátory.

Prohlášení

Toto chování je záměrné.

Další informace

Následující ukázka způsob instalace systému Windows zavěšení zpráva nemodální třídy odvozené CPropertySheet:

Ukázkový kód

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

   }
				

Postup reprodukce problému

  1. Vyberte ControlWizard ActiveX MFC ActiveX vytvoření ovládacího prvku. Přijmout výchozí nastavení.
  2. Při poklepání uvnitř ovládacího prvku, zobrazit nemodální dialogové okno pole nebo propertysheet.
VÝSLEDKY: stisknutím klávesy TAB nebo klávesové zkratky při zobrazené nemodální dialogové okno propertysheet nebo pole nemá žádný vliv.

Odkazy

(c) Microsoft Corporation 1998, všechny rezervované práv. Příspěvky podle Yeong Kah Tam, společnost

Vlastnosti

ID článku: 187988 - Poslední aktualizace: 21. listopadu 2006 - Revize: 6.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Foundation Class Library 4.2 na těchto platformách
    • 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
Klíčová slova: 
kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:187988

Dejte nám zpětnou vazbu

 

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