Клавиши в окне wpf, размещенном в MFC ActiveX, работающем в Internet Explorer - PullRequest
3 голосов
/ 06 апреля 2010

У нас есть элемент управления MFC ActiveX, созданный в Visual Studio 2008 с поддержкой CLR, который создает сетку WPF и показывает окно WPF внутри этой сетки.

Этот ActiveX размещен в Internet Explorer, и он отображается и работает хорошо, за исключением того, что не работают клавиши табуляции, клавиши возврата, функциональные клавиши и т. Д., Поскольку они обрабатываются IE вместо окна WPF. Обычные персонажи работают хорошо. Это известная функция, и ранее, когда мы использовали диалоговые окна на основе MFC в этом ActiveX, мы использовали это: http://support.microsoft.com/kb/187988. Просто используя этот код, можно

AfxGetApp()->PreTranslateMessage((LPMSG)lParam) 

оператор вернет FALSE, поэтому я не могу обработать нажатие клавиши окном WPF. Мне кажется, мне нужно спросить это у приложения WPF вместо CWinApp, но я не уверен, как и если это можно сделать. У кого-нибудь достаточно понимания того, что здесь происходит, чтобы заставить это работать?

Использование XBAP вместо ActiveX не вариант, так как он запускается в приложении интрасети, которому требуется больше доступа, чем может дать нам песочница.

Надеюсь, этой информации достаточно.

С наилучшими пожеланиями

Свейн Дибвик

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Мы разместили пользовательский элемент управления WPF в немодальном диалоговом окне MFC.Чтобы заставить некоторые элементы клавиатуры работать правильно, нам пришлось изменить функцию диалогов PreTranslateMessage ().

По сути, мы проверяли, было ли сообщение для окна WPF.Если это так, мы немедленно вызываем TranslateMessage / DispatchMessage, а затем возвращаем TRUE из PreTranslateMessage.

Наш элемент управления WPF заполняет весь диалог, поэтому вам потребуется собственная условная проверка, где у нас есть тест IsChild.

BOOL CHostDlg::PreTranslateMessage(MSG* pMsg)
{
   // normal PreTranslateMessage() causes the edit fields not to work
   if (::IsChild(GetSafeHwnd(), pMsg->hwnd))
   {
      TranslateMessage(pMsg);
      DispatchMessage(pMsg);

      return TRUE;
   }

   return baseclass::PreTranslateMessage(pMsg);
}
0 голосов
/ 26 января 2016

Некоторые редактируют:

BOOL CHostDlg::PreTranslateMessage(MSG* pMsg)
    {
       // normal PreTranslateMessage() causes the edit fields not to work
       if (::IsChild(GetSafeHwnd(), pMsg->hwnd))
       {
          TranslateMessage(pMsg);
          DispatchMessage(pMsg);
          pMsg->hwnd = GetSafeHwnd(); // redirect to parent
       }
       return baseclass::PreTranslateMessage(pMsg);
    }
...