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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本: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 的貢獻。

ocx kbcodesam 定位點攔截 dll mfcdll

警告:本文為自動翻譯

內容

文章識別碼:187988 - 最後檢閱時間:12/05/2015 08:49:28 - 修訂: 6.1

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbcode kbctrlcreate kbdlg kbprb KB187988 KbMtzh
意見反應