не-Unicode WM_CHAR в окнах Unicode - PullRequest
       16

не-Unicode WM_CHAR в окнах Unicode

2 голосов
/ 20 апреля 2009

Я написал DLL, которая экспортирует функцию, которая создает окно, используя RegisterClassExW и CreateWindowExW. Каждое сообщение извлекается через

GetMessageW(&msg, wnd_handle, 0, 0);
TranslateMessage(&msg);
DispatchMessageW(&msg);

Также есть программа, которая загружает DLL и вызывает функцию.

Несмотря на метод создания окна Unicode, wParam в сообщении WM_CHAR всегда содержит символы ASCII, даже если я набираю некоторые символы не-ASCII или использую Alt + (код). Вместо UTF-16 wParam содержит некоторый символ ASCII между «A» и «z». WndProc является статической функцией внутри DLL.

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

Есть ли способ всегда иметь сообщения Unicode WM_CHAR внутри окна DLL?

Ответы [ 3 ]

4 голосов
/ 22 мая 2009

проблема была в процессе поиска сообщений. Я использовал GetMessage() с ручкой моего окна вместо 0, GetMessageW(&msg, wnd_handle, 0, 0) вместо GetMessageW(&msg, 0, 0, 0).
Таким образом, сообщения WM_INPUTLANGCHANGEREQUEST были проглочены, а локаль оставалась английской.

2 голосов
/ 01 мая 2009

Ваш подход выглядит так, как будто он должен работать.

Возможно ли, что вы вызываете ANSI DefWindowProc вместо широкой версии? Это переведет WM_UNICHAR в сообщения ANSI WM_CHAR. Может быть, это объясняет, что вы видите.

В качестве эксперимента я бы обработал сообщения WM_UNICHAR напрямую и посмотрел бы, как выглядят данные в этот момент.

0 голосов
/ 20 апреля 2009

Я не уверен на 100%, но это может помочь:

Посмотрите настройки проекта, в котором вы реализуете код, который вызывает функции DLL. Убедитесь, что набор символов также UNICODE, а не многобайтовый:

(перейдите в Свойства проекта, затем в раздел «Общие» и установите для параметра «Набор символов» значение «Использовать набор символов Юникода»). Я предполагал, что вы используете Visual Studio 2003 или более позднюю версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...