.NET + COM изменил поведение маршрутизации клавиатуры - PullRequest
1 голос
/ 17 февраля 2009

У меня такая странная проблема, что я вряд ли смогу дать ей адекватное название.

Вкратце: у меня есть COM-объект, написанный на MSVC ++ / MFC с диалогом, производным от CDialog. В этом диалоге у меня есть три дочерних "пользовательских элемента управления" - окна, полученные из простого CWnd.

Когда я использую этот COM-объект из разных мест, все работает, как я ожидаю. Но когда я использую его из приложения C # (файл .exe), поведение клавиатуры отличается или, я бы сказал, не работает.

И под другим я подразумеваю, что:

  • каждая клавиша, нажатая, когда любой из моих «пользовательских элементов управления» имеет фокус, откуда-то выдает «звуковой сигнал об ошибке», даже если я пытаюсь проглотить сообщение WM_KEYDOWN
  • нет WM_CHAR / OnChar получен "пользовательским элементом управления", хотя Spy ++ говорит, что один опубликован
  • если я сначала помещу MessageBox в OnKeyDown и OnChar, ТОГДА внезапно вызывается OnChar и вызывается ДО ТОГО, как отображается MessageBox, расположенный первым в OnKeyDown
  • Я могу преодолеть отсутствие вызова OnChar, отправив сообщение от OnKeyDown, но не могу найти способ прекратить гудок

Это все ИЗМЕНЕННОЕ поведение по сравнению с диалоговым окном COM-объекта, используемым не из приложений .NET.

Я нашел работу, вокруг которой я не совсем доволен, поэтому, если бы кто-нибудь мог пролить свет на эту проблему, я был бы очень счастлив! : -)

Работа вокруг идет так. Вместо того, чтобы создавать мои «пользовательские элементы управления», вот так:

m_mheSpell.CreateEx(
    WS_EX_CLIENTEDGE,
    NULL,
    "",
    WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL,
    4,18,340,100,
    GetSafeHwnd(), (HMENU)3000 );

Я изменяю это на:

m_mheSpell.CreateEx(
    WS_EX_CLIENTEDGE,
    "Edit",  // <-- changed here
    "",
    WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL,
    4,18,340,100,
    GetSafeHwnd(), (HMENU)3000 );

и тогда я должен убедиться, что блокирую сообщения клавиатуры, мыши и фокуса, чтобы основной элемент редактирования не мешал мне. Я просто боюсь, что пропущу, чтобы заблокировать какое-то важное сообщение, и пользователь сам обнаружит неожиданное поведение, прежде чем я сам его найду ...

Вкратце: «что-то» (связанное с окружающей средой .NET) считает, что мои «элементы управления CWnd» не способны выполнять обработку клавиатуры, и портит меня. Извлечение из «Правки» заставляет это «что-то» изменить его мнение. Все это НЕ происходит, когда окружающий процесс является, например, приложением VB6.

Кто?

1 Ответ

1 голос
/ 17 февраля 2009

Ах, теперь я могу ответить на свой вопрос: WM_GETDLGCODE Вздох

...