Использование редактора методов ввода в игре

Примечание.

В этой статье описано, как работать с редактором методов ввода Windows XP (IME). Изменения были внесены в IME для Windows Vista, которые не подробно описаны в этой статье.

Редактор методов ввода (IME) — это программа, которая позволяет легко вводить текст с помощью стандартной клавиатуры для восточноазиатских языков, таких как китайский, японский, корейский и другие языки со сложными символами. Например, при использовании IMEs пользователь может вводить сложные символы в текстовом процессоре, или игрок массовой многопользовательской онлайн-игры может общаться с друзьями в сложных символах.

В этой статье объясняется, как реализовать базовый элемент управления редактированием IME в полноэкранном приложении Microsoft DirectX. Приложения, которые используют преимущества DXUT, автоматически получают функции IME. Для приложений, которые не используют платформу, в этой статье описывается добавление поддержки IME в элемент управления редактированием.

Содержимое.

Поведение IME по умолчанию

ImEs сопоставляют ввод клавиатуры с фонетических компонентов или других языковых элементов, относящихся к выбранному языку. В типичном сценарии ключи пользовательского типа, представляющие произношение сложного символа. Если IME распознает произношение как допустимое, он представляет пользователю список слов или кандидатов фраз, из которых пользователь может выбрать окончательный выбор. Затем выбранное слово отправляется приложению через ряд сообщений Microsoft Windows WM_CHAR . Так как IME работает на уровне ниже приложения путем перехвата ввода клавиатуры, присутствие IME прозрачно для приложения. Почти все приложения Windows могут легко воспользоваться преимуществами IMEs, не зная о их существовании и не требуя специального написания кода.

Типичный IME отображает несколько окон для руководства пользователя по вводу символов, как показано в следующих примерах.

ime displays several windows

Тип окна Description Выходные данные IME
А. Окно чтения Содержит нажатия клавиш на клавиатуре; обычно изменяется после каждого нажатия клавиш. чтение строки
B. Окно композиции Содержит коллекцию символов, которые пользователь создал с помощью IME. Эти символы рисуются IME поверх приложения. Когда пользователь уведомляет IME о том, что строка композиции удовлетворительна, IME отправляет строку композиции приложению через ряд сообщений WM_CHAR. строка композиции
C. Окно кандидата Когда пользователь ввел допустимое произношение, IME отображает список кандидатов символов, которые соответствуют заданному произношению. Затем пользователь выбирает нужный символ из этого списка, а IME добавляет этот символ в окно композиции. следующий символ в строке композиции
D. Индикатор языкового стандарта ввода Показывает язык, выбранный пользователем для ввода клавиатуры. Этот индикатор внедрен в панель задач Windows. Язык ввода можно выбрать, открыв панель управления региональных и языковых параметров, а затем щелкнув "Сведения" на вкладке "Языки". -

Использование imEs с DXUT

В DXUT класс CDXUTIMEEditBox реализует функции IME. Этот класс является производным от класса CDXUTEditBox, базового элемента управления редактирования, предоставленного платформой. CDXUTIMEEditBox расширяет элемент управления редактированием для поддержки imEs, переопределяя методы CDXUTIMEEditBox. Классы предназначены таким образом, чтобы помочь разработчикам узнать, что им нужно принять из платформы для реализации поддержки IME в собственных элементах управления редактированием. В остальной части этого раздела объясняется, как платформа и CDXUTIMEEditBox, в частности, переопределяет базовый элемент управления редактирования для реализации функциональных возможностей IME.

Большинство переменных IME в CDXUTIMEEditBox объявлены как статические, так как многие буферы и состояния IME относятся к процессу. Например, процесс имеет только один буфер для строки композиции. Даже если процесс содержит десять элементов управления редактированием, все они будут совместно использовать один и тот же буфер строки композиции. Таким образом, буфер строки композиции для CDXUTIMEEditBox является статическим, что не позволяет приложению занимать ненужное пространство памяти.

CDXUTIMEEditBox реализован в следующем коде DXUT:

(корневой каталог SDK)\Samples\C++\Common\DXUTgui.cpp

Переопределение поведения IME по умолчанию

Обычно IME использует стандартные процедуры Windows для создания окна (см. раздел "Использование Windows"). В обычных условиях это дает удовлетворительные результаты. Однако если приложение отображается в полноэкранном режиме, как и обычно для игр, стандартные окна больше не работают и могут не отображаться в верхней части приложения. Чтобы устранить эту проблему, приложение должно рисовать сами окна IME, а не полагаться на Windows для выполнения этой задачи.

Если поведение создания окна IME по умолчанию не предоставляет необходимых приложений, приложение может переопределить обработку окна IME. Приложение может достичь этого, обрабатывая сообщения, связанные с IME, и вызывая API input Method Manager (IMM).

Когда пользователь взаимодействует с IME для ввода сложных символов, IMM отправляет сообщения приложению, чтобы уведомить его о важных событиях, таких как запуск композиции или отображение окна кандидата. Приложение обычно игнорирует эти сообщения и передает их обработчику сообщений по умолчанию, что приводит к их обработке IME. Когда приложение вместо обработчика по умолчанию обрабатывает сообщения, он управляет именно тем, что происходит при каждом из событий IME. Часто обработчик сообщений извлекает содержимое различных окон IME путем вызова API IMM. После получения этой информации приложение может правильно рисовать окна IME, когда оно должно отображаться на экране.

Функции

IME должен получить строку чтения, скрыть окно чтения и получить ориентацию окна чтения. В этой таблице показаны функциональные возможности для каждой версии IME:

Получение строки чтения Скрытие окна чтения Ориентация окна чтения
До версии 6.0 А. Чтение частных данных IME окна доступа к IME напрямую. См. раздел "Структура 4" Ловушка частных сообщений IME. См. раздел "3 сообщения" Изучите сведения о реестре. См. раздел "Сведения о реестре 5"
После версии 6.0 GetReadingStringString ShowReadingWindow GetReadingStringString

Сообщения

Для более новой версии IME, реализующей ShowReadingWindow(), не нужно обрабатывать следующие сообщения.

Следующие сообщения находятся в ловушке обработчиком сообщений приложения (т. е. они не передаются в DefWindowProc), чтобы предотвратить отображение окна чтения.

Msg == WM_IME_NOTIFY
wParam == IMN_PRIVATE
lParam == 1, 2 (CHT IME version 4.2, 4.3 and 4.4 / CHS IME 4.1 and 4.2)
lParam == 16, 17, 26, 27, 28 (CHT IME version 5.0, 5.1, 5.2 / CHS IME 5.3)

Примеры

В следующих примерах показано, как получить сведения о строке чтения из более старых IME, у которых нет GetReadingString(). Код создает следующие выходные данные:

Выходные данные Description
Dwlen DWORD Длина строки чтения.
DWORD dwerr Индекс символа ошибки.
WSTR LPWSTR Указатель на строку чтения.
Юникод BOOL Если значение true, строка чтения находится в формате Юникода. В противном случае он находится в многобайтовом формате.

CHT IME версии 4.2, 4.3 и 4.4

LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 24);
if (!p) break;
dwlen = *(DWORD *)(p + 7*4 + 32*4);
dwerr = *(DWORD *)(p + 8*4 + 32*4);
wstr = (WCHAR *)(p + 56);
unicode = TRUE;

CHT IME версии 5.0

LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 3*4);
if (!p) break;
p = *(LPBYTE *)((LPBYTE)p + 1*4 + 5*4 + 4*2 );
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 + 1*4);
wstr = (WCHAR *)(p + 1*4 + (16*2+2*4) + 5*4);
unicode = FALSE;

CHT IME версии 5.1, 5.2 и CHS IME версии 5.3

LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 4);
if (!p) break;
p = *(LPBYTE *)((LPBYTE)p + 1*4 + 5*4); 
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * 2);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * 2 + 1*4);
wstr  = (WCHAR *) (p + 1*4 + (16*2+2*4) + 5*4);
unicode = TRUE;

CHS IME версии 4.1

// GetImeId(1) returns VS_FIXEDFILEINFO:: dwProductVersionLS of IME file
int offset = ( GetImeId( 1 ) >= 0x00000002 ) ? 8 : 7;
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
BYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + offset * 4);
if (!p) break;
dwlen = *(DWORD *)(p + 7*4 + 16*2*4);
dwerr = *(DWORD *)(p + 8*4 + 16*2*4);
dwerr = min(dwerr, dwlen);
wstr = (WCHAR *)(p + 6*4 + 16*2*1);
unicode = TRUE;

CHS IME версии 4.2

int nTcharSize = IsNT() ? sizeof(WCHAR) : sizeof(char);
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
BYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 1*4 + 1*4 + 6*4);
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * nTcharSize);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * nTcharSize + 1*4);
wstr  = (WCHAR *) (p + 1*4 + (16*2+2*4) + 5*4);
unicode = IsNT() ? TRUE : FALSE;

Сообщения IME

Полноэкранное приложение должно правильно обрабатывать следующие сообщения, связанные с IME:

WM_INPUTLANGCHANGE

IMM отправляет WM_INPUTLANGCHANGE сообщение в активное окно приложения после изменения входного языкового стандарта пользователем с сочетанием клавиш (обычно ALT+SHIFT) или с индикатором входного языкового стандарта на панели задач или языковой панели. Строка языка — это элемент управления на экране, с помощью которого пользователь может настроить текстовую службу. (См. раздел Как отобразить языковую панель.) На следующем снимке экрана показан список выбора языка, отображаемый при нажатии пользователем индикатора языкового стандарта.

language selection list that is displayed when the user clicks on the locale indicator

Когда IMM отправляет сообщение WM_INPUTLANGCHANGE, CDXUTIMEEditBox должен выполнять несколько важных задач:

  1. Метод GetKeyboardLayout вызывается для возврата входного идентификатора языкового стандарта (ID) для потока приложения. Класс CDXUTIMEEditBox сохраняет этот идентификатор в своей переменной статических элементов s_hklCurrent для последующего использования. Важно знать текущий языковой стандарт ввода, так как IME для каждого языка имеет свое собственное поведение. Разработчику может потребоваться предоставить другой код для разных языковых стандартов ввода.
  2. CDXUTIMEEditBox инициализирует строку для отображения в индикаторе языка поля редактирования. Этот индикатор может отображать активный язык ввода, если приложение работает в полноэкранном режиме, и ни панель задач, ни языковая панель не отображаются.
  3. Метод ImmGetConversionStatus вызывается, чтобы указать, находится ли входной языковой стандарт в собственном или не собственном режиме преобразования. Собственный режим преобразования позволяет пользователю вводить текст на выбранном языке. Неродной режим преобразования делает клавиатуру стандартной английской клавиатурой. Важно предоставить пользователю визуальный сигнал о том, в каком режиме преобразования находится IME, чтобы пользователь легко знал, какие символы следует ожидать при нажатии клавиши. CDXUTIMEEditBox предоставляет этот визуальный сигнал с цветом индикатора языка. Если входной языковой стандарт использует IME с собственным режимом преобразования, класс CDXUTIMEEditBox рисует текст индикатора с цветом, определенным параметром m_IndicatorImeColor. Если IME находится в режиме преобразования, отличном от собственного кода, или IME вообще не используется, класс рисует текст индикатора с цветом, определенным параметром m_IndicatorEngColor.
  4. CDXUTIMEEditBox проверка входной языковой стандарт и задает статическую переменную-член s_bInsertOnType значение TRUE для корейского и FALSE для всех других языков. Этот флаг необходим из-за различных действий корейских IMEs и всех других IMEs. При вводе символов на языках, отличных от корейского, введенный пользователем текст отображается в окне композиции, а пользователь может свободно изменять содержимое строки композиции. Пользователь нажимает клавишу ВВОД при удовлетворении строки композиции, а строка композиции отправляется приложению в виде ряда сообщений WM_CHAR. Однако в корейских мгновенных сообщениях, когда пользователь нажимает клавишу для ввода текста, символ немедленно отправляется приложению. Когда пользователь впоследствии нажимает дополнительные клавиши, чтобы изменить этот начальный символ, символ в поле редактирования изменяется, чтобы отразить дополнительные входные данные от пользователя. По сути, пользователь создает символы в поле редактирования. Эти два поведения отличаются достаточно, чтобы CDXUTIMEEditBox должен код для каждого из них в частности.
  5. Метод static member SetupImeApi вызывается для получения адресов двух функций из модуля IME: GetReadingString и ShowReadingWindow. Если эти функции существуют, вызывается ShowReadingWindow, чтобы скрыть окно чтения по умолчанию для этого IME. Так как приложение отрисовывает само окно чтения, оно уведомляет IME отключать окно чтения по умолчанию, чтобы не препятствовать отрисовке полноэкранной отрисовки.

IMM отправляет сообщение WM_IME_SETCONTEXT при активации окна приложения. Параметр lParam этого сообщения содержит флаг, указывающий на IME, какие окна должны быть нарисованы и которые не должны быть. Так как приложение обрабатывает весь документ, IME не требуется для рисования любого из окон IME. Поэтому обработчик сообщений приложения просто задает lParam значение 0 и возвращает.

Чтобы приложения поддерживали IME, для WM_IME_SETCONTEXT сообщения, связанного с IME, требуется специальная обработка. Так как Windows обычно отправляет это сообщение приложению до вызова метода PanoramaInitialize(), Panorama не может обработать пользовательский интерфейс для отображения окон списка кандидатов.

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

case WM_IME_SETCONTEXT:
         lParam = 0;
    lRet = DefWindowProc(hWnd, msg, wParam, lParam);
    break;
    //... more message processing
    return lRet;

WM_IME_STARTCOMPOSITION

IMM отправляет WM_IME_STARTCOMPOSITION сообщение приложению, когда композиция IME начинается в результате нажатия клавиш пользователем. Если IME использует окно композиции, он отображает текущую строку композиции в окне композиции. CDXUTIMEEditBox обрабатывает это сообщение, выполняя две задачи:

  1. CDXUTIMEEditBox очищает буфер строки композиции и буфер атрибутов. Эти буферы являются статическими элементами CDXUTIMEEditBox.
  2. CDXUTIMEEditBox задает значение TRUE для переменной статических элементов s_bHideCaret. Этот элемент, определенный в базовом классе CDXUTEditBox, определяет, должен ли курсор в поле редактирования быть нарисован при отрисовке поля редактирования. Окно композиции работает аналогично полям редактирования с текстом и курсором. Чтобы избежать путаницы при отображении окна композиции, поле редактирования скрывает курсор таким образом, чтобы одновременно отображалось только один курсор.

WM_IME_COMPOSITION

IMM отправляет WM_IME_COMPOSITION сообщение приложению, когда пользователь вводит нажатие клавиш, чтобы изменить строку композиции. Значение lParam указывает, какой тип информации приложение может получить из диспетчера методов ввода (IMM). Приложение должно получить доступную информацию путем вызова ImmGetCompositionString , а затем сохранить сведения в закрытом буфере, чтобы он смог отрисовки элементов IME позже.

Проверка CDXUTIMEEditBox для и извлекает следующие данные строки композиции:

значение флага WM_IME_COMPOSITION lParam Data Description
GCS_COMPATTR Атрибут композиции Этот атрибут содержит такие сведения, как состояние каждого символа в строке композиции (например, преобразованное или не преобразованное). Эта информация необходима, так как CDXUTIMEEditBox цветирует символы строки композиции по-разному на основе их атрибутов.
GCS_COMPCLAUSE Сведения о предложении композиции Эта информация используется при активной активности японского IME. При преобразовании строки японской композиции символы могут сгруппироваться в виде предложения, которое преобразуется в одну сущность. Когда пользователь перемещает курсор, CDXUTIMEEditBox использует эту информацию для выделения всего предложения вместо одного символа в предложении.
GCS_COMPSTR Строка композиции Эта строка является актуальной строкой, созданной пользователем. Это также строка, отображаемая в окне композиции.
GCS_CURSORPOS Положение курсора композиции Окно композиции реализует курсор, аналогичный курсору в поле редактирования. Приложение может получить позицию курсора при обработке сообщения WM_IME_COMPOSITION для правильного рисования курсора.
GCS_RESULTSTR Строка результата Строка результата доступна, когда пользователь завершает процесс композиции. Эта строка должна быть извлечена, а символы должны быть отправлены в поле редактирования.

WM_IME_ENDCOMPOSITION

IMM отправляет WM_IME_ENDCOMPOSITION сообщение приложению при завершении операции композиции IME. Это может произойти, когда пользователь нажимает клавишу ВВОД для утверждения строки композиции или клавиши ESC для отмены композиции. CDXUTIMEEditBox обрабатывает это сообщение, задав буфер строки композиции пустым. Затем он задает s_bHideCaret значение FALSE, так как окно композиции закрыто, а курсор в поле редактирования снова должен быть видимым.

Обработчик сообщений CDXUTIMEEditBox также задает значение FALSE s_bShowReadingWindow. Этот флаг определяет, рисует ли класс окно чтения при отрисовке самого поля редактирования, поэтому оно должно иметь значение FALSE, когда композиция заканчивается.

WM_IME_NOTIFY

IMM отправляет WM_IME_NOTIFY сообщение приложению при каждом изменении окна IME. Приложение, обрабатывающее рисунок окон IME, должно обработать это сообщение, чтобы оно знали о любом обновлении содержимого окна. WParam указывает команду или изменение, которое происходит. CDXUTIMEEditBox обрабатывает следующие команды:

Команда IME Description
IMN_SETOPENSTATUS Этот атрибут содержит такие сведения, как состояние каждого символа в строке композиции (например, преобразованное или не преобразованное). Эта информация необходима, так как CDXUTIMEEditBox цветирует символы строки композиции по-разному на основе их атрибутов.
/ IMN_OPENCANDIDATE IMN_CHANGECANDIDATE Отправляется в приложение при открытии или обновлении окна кандидата соответственно. Окно кандидата открывается, когда пользователь хочет изменить преобразованный выбор текста. Окно обновляется при перемещении индикатора выбора или изменении страницы. CDXUTIMEEditBox использует один обработчик сообщений для обеих этих команд, так как необходимые задачи совпадают:
  1. CDXUTIMEEditBox задает элемент bShowWindow структуры списка кандидатов s_CandList значение TRUE, чтобы указать, что во время отрисовки кадра необходимо нарисовать окно кандидата.
  2. CDXUTIMEEditBox извлекает список кандидатов, вызвав ImmGetCandidateList, сначала чтобы получить требуемый размер буфера, а затем еще раз, чтобы получить фактические данные.
  3. Структура списка частных кандидатов, s_CandList инициализирована с извлеченными данными кандидата.
  4. Строки-кандидаты хранятся в виде массива строк.
  5. Индекс выбранной записи, а также индекс страницы сохраняется.
  6. CDXUTIMEEditBox проверка, является ли стиль окна кандидата вертикальным или горизонтальным. Если стиль окна является горизонтальным, дополнительный буфер строки, член HoriCand s_CandList, должен быть инициализирован со всеми строками-кандидатами, с пробелами, вставленными между всеми смежными строками. При отрисовке вертикального окна кандидатов отдельные строки кандидатов нарисуются по одному за раз, а координаты y увеличиваются для каждой строки. Однако эту строку HoriCand следует использовать при отрисовке горизонтального окна кандидата, так как символ пространства является лучшим способом разделения двух смежных строк в одной строке.
IMN_CLOSECANDIDATE Отправляется в приложение при закрытии окна кандидата. Это происходит, когда пользователь сделал выбор из списка кандидатов. CDXUTIMEEditBox обрабатывает эту команду, задав видимый флаг окна кандидата значение FALSE, а затем очищая буфер строки кандидата.
IMN_PRIVATE Отправлено приложению, когда IME обновил свою строку чтения в результате ввода или удаления символов пользователем. Приложение должно получить строку чтения и сохранить ее для отрисовки. CDXUTIMEEditBox имеет два метода для получения строки чтения на основе того, как строки чтения поддерживаются в IME:
  • Если IME поддерживает функцию GetReadingString, метод GetReadingString вызывается для получения строки чтения.
  • Если IME не реализует GetReadingString, CDXUTIMEEditBox извлекает строку чтения из содержимого входного контекста.

Отрисовка

Отрисовка элементов и окон IME проста. CDXUTIMEEditBox позволяет базовому классу сначала отображаться, так как окна IME должны отображаться в верхней части элемента управления редактирования. После отрисовки базового поля редактирования CDXUTIMEEditBox проверка флаг видимости каждого окна IME (индикатор, композиция, кандидат и окно чтения) и рисует окно, если оно должно быть видимым. Описание различных типов окон IME по умолчанию см. в разделе "Поведение IME по умолчанию".

Индикатор языкового стандарта ввода

Индикатор входного языкового стандарта отображается перед любыми другими окнами IME, так как это элемент, который всегда отображается. Поэтому он должен отображаться под другими окнами IME. CDXUTIMEEditBox отрисовывает индикатор путем вызова метода RenderIndicator, в котором цвет шрифта индикатора определяется путем изучения статической переменной s_ImeState, которая отражает текущий режим преобразования IME. Если включена функция IME и активное преобразование в машинном коде, метод использует m_IndicatorImeColor в качестве цвета индикатора. Если IME отключен или находится в режиме преобразования, отличном от машинного кода, m_IndicatorImeColor используется для рисования текста индикатора. По умолчанию окно индикатора рисуется справа от поля редактирования. Приложения могут изменить это поведение, переопределив метод RenderIndicator.

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

different appearances of an input locale indicator for english and japanese

Окно композиции

Рисунок окна композиции обрабатывается в методе RenderComposition CDXUTIMEEditBox. Окно композиции плавает над полем редактирования. Он должен быть нарисован в позиции курсора базового элемента управления редактирования. CDXUTIMEEditBox обрабатывает отрисовку следующим образом:

  1. Вся строка композиции рисуется с помощью цветов строки композиции по умолчанию.
  2. Символы с определенными специальными атрибутами должны быть нарисованы различными цветами, поэтому CDXUTIMEEditBox проверяет символы строки композиции и проверяет атрибут строки. Если атрибут вызывает разные цвета, символ снова рисуется с соответствующими цветами.
  3. Курсор окна композиции рисуется для завершения отрисовки.

Курсор должен мигать для корейских IMEs, но он не должен быть для других imEs. RenderComposition определяет, должен ли курсор отображаться на основе значений таймера при использовании корейского IME.

Чтение и кандидат windows

Окна чтения и кандидатов отображаются тем же методом CDXUTIMEEditBox, RenderCandidateReadingWindow. Оба окна содержат массив строк для вертикального макета или одну строку в случае горизонтального макета. Основная часть кода в RenderCandidateReadingWindow используется для размещения окна, чтобы часть окна не падала за пределы окна приложения и не обрезалась.

Ограничения

В мгновенных сообщениях иногда содержатся расширенные функции для повышения удобства ввода текста. Некоторые функции, найденные в новых мгновенных сообщениях, показаны на следующих рисунках. Эти расширенные функции отсутствуют в DXUT. Реализация поддержки этих расширенных функций может быть сложной, так как интерфейс не определен для получения необходимых сведений из IMEs.

Расширенный китайский IME с расширенным списком кандидатов:

advanced traditional chinese ime with expanded candidate list

Расширенный японский IME с некоторыми записями кандидата, которые содержат дополнительный текст для описания их значений:

advanced japanese ime with some candidate entries that contain additional text to describe their meanings

Расширенный корейский IME, включающий систему распознавания рукописного ввода:

advanced korean ime that includes a handwriting recognition system

Сведения о реестре

Следующие сведения о реестре проверка для определения ориентации окна чтения, если текущий IME старше CHT New Телефон tic, который не реализует GetReadingStringString().

Ключ Значение
HKCU\software\microsoft\windows\currentversion\IME_Name Сопоставление клавиатуры

Где: IME_Name — MSTCIPH, если версия файла IME — 5.1 или более поздняя; в противном случае IME_Name — TINTLGNT.

Ориентация окна чтения по горизонтали, если одно из следующих значений:

  • IME версии 5.0, а значение сопоставления клавиатуры — 0x22 или 0x23
  • IME — это версия 5.1 или версия 5.2, а значение сопоставления клавиатуры — 0x22, 0x23 или 0x24.

Если условие не выполняется, окно чтения вертикали.

Приложение A. Версии CHT для каждой операционной системы

Операционная система Версия IME CHT
Windows 98 4.2
Windows 2000 4.3
неизвестно 4.4.
Windows ME 5,0
Office XP 5.1
Windows XP 5,2
Автономный веб-скачивание 6,0

Дополнительные сведения

Дополнительные сведения см. в следующих разделах:

GetReadingStringString

Получает чтение строковых сведений.

Параметры

ему

[in] Контекст ввода.

uReadingBufLen

[in] Длина lpwReadingBuf в WCHAR. Если значение равно нулю, это означает длину буфера чтения запросов.

lpwReadingBuf

[out] Возвращает строку чтения (не нулевой конец).

pnErrorIndex

[out] Возвращает индекс символа ошибки в строке чтения, если есть.

pfIsVertical

[out] Если это значение TRUE, пользовательский интерфейс чтения вертикали. В противном случае — горизонтальный puMaxReadingLen.

puMaxReadingLen

[out] Длина пользовательского интерфейса чтения. Максимальная длина чтения не фиксирована; он зависит не только от раскладки клавиатуры, но и от режима ввода (например, внутреннего кода, суррогатного ввода).

Возвращаемые значения

Длина строки чтения.

Замечания

Если возвращаемое значение больше значения uReadingBufLen, все выходные параметры не определены.

Эта функция реализована в IME 6.0 или более поздней версии CHT и может быть приобретена GetProcAddress в дескрипторе модуля IME; Дескриптор модуля IME можно получить с помощью ImmGetIMEFileName и LoadLibrary.

Requirements

Верхний колонтитул

Объявлен в Imm.h.

Импорт библиотеки

Используйте Imm.lib.

ShowReadingWindow

Отображение (или скрытие) окна чтения.

Параметры

ему

[in] Контекст ввода.

bShow

[in] Установите значение TRUE, чтобы отобразить окно чтения (или FALSE, чтобы скрыть его).

Возвращаемые значения

Замечания

Возвращает значение TRUE, если выполнено успешно или FALSE, если в противном случае.

Requirements

Верхний колонтитул

Объявлен в Imm.h.

Импорт библиотеки

Используйте Imm.lib.