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