.NET + COM изменил поведение маршрутизации клавиатуры

StackOverflow https://stackoverflow.com/questions/557038

Вопрос

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

Короче говоря:У меня есть 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 );

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

Короче говоря:"что-то" (связанное с окружением .СЕТЕВАЯ среда) думает, что мои "элементы управления CWnd" не способны выполнять обработку с клавиатуры, и сбивает меня с толку.Вывод из "Редактировать" заставляет это "что-то" изменить свое мнение.Всего этого НЕ происходит, когда окружающим процессом является, например, приложение VB6.

Кто-то?

Это было полезно?

Решение

Ах, теперь я могу ответить на свой собственный вопрос:WM_GETDLG - КОД вздох

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top