.NET + COM изменил поведение маршрутизации клавиатуры
Вопрос
У меня проблема настолько странная, что я едва ли могу дать ей адекватное название.
Короче говоря:У меня есть 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 - КОД вздох