Các TAB phím, phím mũi tên và họa phím không hoạt động như mong đợi khi điều khiển ActiveX là cửa sổ phụ huynh của một hộp thoại modeless hoặc của một cửa sổ propertysheet

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:187988
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
TRIỆU CHỨNG
Khi điều khiển ActiveX là cửa sổ cha của một modeless cửa sổ hộp thoại hộp hoặc propertysheet, các TAB phím, phím mũi tên, và gia tốc phím không làm việc như mong đợi. Phím TAB không di chuyển tiêu điểm đầu vào từ một trong những kiểm soát khác. Nhấn các phím mũi tên hoặc họa phím trong modeless cửa sổ hộp thoại hộp hoặc propertysheet không có hiệu lực.
NGUYÊN NHÂN
Vấn đề là điều khiển ActiveX không sở hữu thư bơm. Các máy bơm thông điệp được sở hữu bởi ứng dụng container. Vì vậy, tất cả các phím tắt thư ký bằng việc áp dụng thùng chứa và không phái đến hộp thoại modeless hộp hoặc propertysheet cửa sổ.

Các vấn đề không xảy ra với một hộp thoại phương thức hộp/propertysheet cửa sổ vì các tin nhắn bơm thuộc sở hữu của người quản lý hộp thoại, và nó sẽ chăm sóc của xử lý tất cả các phím tắt thư.
GIẢI PHÁP
Cài đặt một móc Windows WH_GETMESSAGE cho modeless hộp thoại hộp/propertysheet bắt nguồn lớp để cho phép nó để đánh chặn tổ hợp phím và xử lý máy gia tốc.
TÌNH TRẠNG
Hành vi này là do thiết kế.
THÔNG TIN THÊM
Mẫu sau đây cho thấy một cách để cài đặt các cửa sổ tin nhắn móc để một lớp học có nguồn gốc CPropertySheet modeless:

Mẫu mã

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

Các bước để tạo lại vấn đề

  1. Chọn MFC ActiveX ControlWizard để tạo ra một ActiveX kiểm soát. Chấp nhận tất cả các thiết lập mặc định.
  2. Hiển thị một hộp thoại modeless hộp hoặc propertysheet cửa sổ khi bấm-đúp vào bên trong sự kiểm soát.
KẾT QUẢ: Khi hộp thoại modeless hộp hoặc propertysheet cửa sổ sẽ được hiển thị, nhấn phím TAB hoặc họa phím không có hiệu lực.
THAM KHẢO
(c) tập đoàn Microsoft 1998, tất cả các quyền. Những đóng góp của Yeong-cho Tam, Microsoft Corporation.

ocx kbcodesam tab móc dll mfcdll

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 187988 - Xem lại Lần cuối: 12/05/2015 08:49:28 - Bản sửa đổi: 2.0

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbcode kbctrlcreate kbdlg kbprb kbmt KB187988 KbMtvi
Phản hồi