TAB 鍵、 箭號鍵和快速鍵無法如預期般運作 ActiveX 控制項時父視窗或 propertysheet 視窗的非強制回應 (Modeless) 對話方塊

文章翻譯 文章翻譯
文章編號: 187988 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

當 ActiveX 控制項的非強制回應 (Modeless) 對話方塊的父視窗或 propertysheet 視窗,TAB 鍵、 箭號鍵和快速鍵沒有如預期般運作。TAB 鍵不會將輸入的焦點從一個控制項移動到另一個。按下方向鍵或對應鍵在非強制回應對話方塊或 propertysheet 視窗不會有任何作用。

發生的原因

問題是 ActiveX 控制項不會擁有訊息幫浦。訊息幫浦是由容器應用程式所擁有。因此,收納器應用程式所要採取所有按鍵輸入郵件並不分派至非強制回應對話方塊或 propertysheet 視窗。

將不會發生問題與強制回應對話方塊方塊/propertysheet 視窗因為訊息幫浦由對話方塊方塊管理員所擁有,它會負責處理按鍵輸入的所有郵件。

解決方案

安裝非強制回應 (Modeless) 對話方塊方塊/propertysheet 衍生類別可以允許按鍵輸入攔截並處理加速器的 Windows WH_GETMESSAGE 勾點。

狀況說明

這種行為是經過設計規劃的。

其他相關資訊

下列範例顯示安裝在 Windows 的方式訊息攔截到非強制回應 (Modeless) 的 CPropertySheet 衍生類別:

範例程式碼

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

   }
				

重現問題的步驟

  1. 選取 [MFC ActiveX ControlWizard 來建立 ActiveX 控制項。接受所有預設設定。
  2. 當按兩下控制項內部,請顯示非強制回應 (Modeless) 的對話方塊或 propertysheet 視窗。
結果: 顯示非強制回應對話方塊或 propertysheet 視窗時按下 TAB 鍵或對應鍵沒有任何作用。

?考

(c) [Microsoft Corporation 1998 年,[保留所有的權限]。 由 Yeong Kah Tam,Microsoft Corporation 的貢獻。

屬性

文章編號: 187988 - 上次校閱: 2006年11月21日 - 版次: 6.1
這篇文章中的資訊適用於:
  • Microsoft Foundation Class Library 4.2?應用於:
    • 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
關鍵字:?
kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:187988
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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