การ TAB คีย์ แป้นลูกศร และตัวเร่งคีย์ไม่ทำงานอย่างที่คาดไว้เมื่อตัวควบคุม ActiveX คือ หน้าต่างหลัก ของกล่องโต้ตอบ modeless หรือหน้าต่าง propertysheet

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 187988 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อตัวควบคุม ActiveX คือ หน้าต่างหลักของกล่องโต้ตอบ modeless หรือหน้าต่าง propertysheet, TAB คีย์ แป้นลูกศร และแป้นตัวเร่งการทำไม่งานตามที่คาดไว้ แป้น TAB ไม่ย้ายโฟกัสสำหรับการป้อนค่าจากตัวควบคุมหนึ่งไปยังอีก กดแป้นลูกศรหรือแป้นตัวเร่งในกล่องโต้ตอบ modeless หรือ propertysheet หน้าต่างได้ไม่มีผล

สาเหตุ

ปัญหานี้มีตัวควบคุม ActiveX ไม่เป็นเจ้าของ pump ข้อความ pump ข้อความเป็นเจ้าของ โดยแอพลิเคชันคอนเทนเนอร์ ดังนั้น ข้อความของการกดแป้นพิมพ์ทั้งหมดจะดำเนินการ โดยโปรแกรมประยุกต์คอนเทนเนอร์ และ dispatched ไปกล่องโต้ตอบ modeless กล่อง propertysheet หน้าต่างหรือไม่

ปัญหาไม่เกิดขึ้นกับ หน้าต่าง/propertysheet กล่องโต้ตอบ modal เนื่องจาก pump ข้อความเป็นเจ้าของผู้จัดการของกล่องโต้ตอบ และภายใต้การดังกล่าวจะดูแลของหน้าที่จัดการข่าวสารการกดแป้นพิมพ์ทั้งหมด

การแก้ไข

ติดตั้ง hook ของบันทึกการ WH_GETMESSAGE Windows สำหรับคลาส กล่อง/propertysheet ที่ได้รับการโต้ตอบ modeless การอนุญาตให้ดักกดแป้นพิมพ์ และจัดการ accelerators

สถานะ

ลักษณะการทำงานนี้เกิดจากการออกแบบ

ข้อมูลเพิ่มเติม

ตัวอย่างต่อไปนี้แสดงวิธีการติดตั้ง Windows ของ hook ข้อความไปยังคลาสที่ 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. เลือก ControlWizard ActiveX MFC ActiveX ในการสร้างตัวควบคุม ยอมรับการตั้งค่าเริ่มต้นทั้งหมด
  2. แสดงการโต้ตอบ modeless กล่อง propertysheet หน้าต่างหรือเมื่อคลิกสองครั้งที่อยู่ภายในตัวควบคุม
ผลลัพธ์: เมื่อมีแสดงโต้ตอบ modeless กล่องหรือ propertysheet หน้าต่าง กดแป้น TAB หรือแป้นตัวเร่งได้ไม่มีผล

ข้อมูลอ้างอิง

(c) Microsoft Corporation 1998 สิทธิ์ทั้งหมดที่สำรองไว้ contributions โดย Kah Yeong Tam, Microsoft Corporation

คุณสมบัติ

หมายเลขบทความ (Article ID): 187988 - รีวิวครั้งสุดท้าย: 12 ตุลาคม 2553 - Revision: 1.0
ใช้กับ
  • Microsoft Foundation Class Library 4.2 เมื่อใช้กับ:
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
Keywords: 
kbcode kbctrlcreate kbdlg kbprb kbmt KB187988 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:187988

ให้ข้อเสนอแนะ

 

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