Почему существуют Unicode и ANSI версии функций CreateAcceleratorTable и TranslateAccelerator? - PullRequest
0 голосов
/ 05 июня 2018

Насколько я вижу, ни функция CreateAcceleratorTable , ни функции TranslateAccelerator не обрабатывают строковые или символьные данные, поэтому мне интересно, почему они доступны в версиях Unicode и ANSI?Это структура данных ACCEL .

1 Ответ

0 голосов
/ 05 июня 2018

CreateAcceleratorTable обрабатывает символьные данные.

Согласно документации MSDN ACCEL структура

ключ
Тип: СЛОВО

Клавиша ускорения.Этот член может быть либо кодом виртуальной клавиши, либо кодом символа.

Код символа может быть больше, чем просто символ ASCII.Вне диапазона ASCII его значение зависит от того, является ли он ANSI или Unicode.

Почему код символа будет больше, чем ASCII?Разве наша клавиатура не имеет только символы ASCII?Ну, вот мое предположение.Представьте себе, что в японской Windows, где ANSI по умолчанию используется Shift-JIS, пользователь из Японии, использующий ввод Kana (где нажатие клавиши может непосредственно вводить あ / い / う / え ...), нажимает клавишу ускорения этих Kana, например Ctrl+あ.

Что касается TranslateAccelerator, поскольку этот ускоритель может быть не-ASCII, также существует необходимость в переводе кода ключа WM_KEYDOWN, WM_SYSKEYDOWN, WM_CHAR иWM_SYSCHAR, для Unicode перед передачей во внутреннюю реализацию.

Следующий фрагмент кода взят из просочившегося исходного кода Windows 2000.

Версия Unicode:

case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_CHAR:
case WM_SYSCHAR:
    return NtUserTranslateAccelerator(hwnd, hAccel, lpMsg);

Версия ANSI:

WPARAM wParamT;
// irrelevant code here...
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_CHAR:
case WM_SYSCHAR:
    wParamT = lpMsg->wParam;
    RtlMBMessageWParamCharToWCS(lpMsg->message, &(lpMsg->wParam));
    iT = NtUserTranslateAccelerator(hwnd, hAccel, lpMsg);
    lpMsg->wParam = wParamT;
    return iT;

Исходный код RtlMBMessageWParamCharToWCS может быть найден здесь .

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