Поделиться через


Требования к редактору пользовательских методов ввода (IME)

Эти рекомендации и требования помогут вам разработать пользовательский редактор методов ввода (IME), чтобы помочь пользователю ввести текст на языке, который не может быть легко представлен на стандартной клавиатуре QWERTY.

Общие сведения о мгновенных сообщениях см. в редакторе методов ввода (IME).

IME по умолчанию

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

Предпочитаемый язык

Выберите клавиатуру по умолчанию на экране параметров языка для предпочтительного языка.

Предпочитаемая клавиатура языка

Внимание

Мы не рекомендуем писать непосредственно в реестр, чтобы задать клавиатуру по умолчанию для пользовательского IME.

Требования к совместимости

Ниже приведены основные требования к совместимости для пользовательского IME.

IME должен быть совместим с приложениями Windows

Используйте платформу текстовых служб (TSF) для реализации imEs. Ранее вы имели возможность использовать диспетчер методов ввода (IMM32) для служб ввода. Теперь системные блоки мгновенных сообщений, реализованные с помощью диспетчера методов ввода (IMM32).

При запуске приложения TSF загружает библиотеку IME для IME, выбранной пользователем. При загрузке IME он подвергается тем же ограничениям контейнеров приложений, что и приложение. Например, IME не может получить доступ к Интернету, если приложение не запрашивало доступ к Интернету в своем манифесте. Это гарантирует, что мгновенные сообщения не могут нарушать контракты безопасности.

TSF — это посредник между приложением и IME. TSF передает входные события в IME и получает входные символы обратно из IME после того, как пользователь выбрал символ.

Это поведение совпадает с предыдущими версиями Windows, но загрузка в приложение Windows влияет на потенциальные возможности IME.

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

Приложения Windows не поддерживают мгновенные сообщения службы текста таблицы (TTS).

Примечание.

Некоторые средства создания TTS IMEs создают мгновенные сообщения, помеченные как вредоносные программы Windows.

IME должен быть совместим с системной областью

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

Индикатор ввода отображает значок фирменной символики IME и значок режима только для совместимых мгновенных сообщений. Мгновенные сообщения, несовместимые, не имеют значка фирменной символики и значка режима, отображаемого в области системы. Вместо этого индикатор ввода отображает сокращение языка вместо значка фирменной символики IME.

Сохраните значки IME в dll или EXE-файле вместо автономного .ico файла. Дизайн значков IME должен соответствовать рекомендациям, описанным в следующем разделе по проектированию пользовательского интерфейса.

Значок фирменной символики IME

Индикатор ввода получает значок фирменной символики IME из библиотеки DLL IME с помощью идентификатора ресурса, определенного IME при регистрации в системе.

Значок режима IME

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

При передаче значков режима IME в входной индикатор на системной области размер значка режима IME по умолчанию составляет 16x16 пикселей. Масштабирование пользовательского интерфейса следует DPI.

При передаче значка режима IME в входной индикатор в UAC (контроль учетных записей пользователей в безопасном рабочем столе) размер значка режима IME по умолчанию составляет 20x20 пикселей. Значок масштабирования пользовательского интерфейса для режима IME в UAC следует PPI.

IME должен работать в контейнере приложений

Некоторые функции IME затрагиваются в контейнере приложения.

  • Файлы словаря . Часто мгновенные сообщения имеют файлы словаря только для чтения, чтобы сопоставить входные данные пользователей с определенными символами. Чтобы получить доступ к этим файлам из контейнера приложения, IME должен поместить их в каталоги Program Files или Windows. По умолчанию эти каталоги можно считывать из контейнера приложений, чтобы мгновенные сообщения могли получать доступ к файлам словарей, хранящимся в этих расположениях. Если IME должен хранить файл словаря в другом месте, он должен явно управлять контроль доступа списками (ACL) файлов словаря, чтобы разрешить доступ из контейнеров приложений.
  • Обновление Интернета. Если IME необходимо обновить словари с помощью данных из Интернета, он не может надежно сделать это внутри контейнера приложения, так как доступ к Интернету не всегда разрешен. Вместо этого IME должен выполнять отдельный рабочий процесс, отвечающий за обновление файлов словаря с данными из Интернета.
  • Во всплывающем обучении . Если IME работает в контейнере приложений с доступом к Интернету, нет ограничений на конечные точки, с которыми может взаимодействовать IME. В этом случае IME может использовать облачный сервер для предоставления служб обучения на лету. Некоторые мгновенные сообщения загружают и отправляют входные данные пользователя во время ввода пользователя. Так как доступ к Интернету не гарантируется в контейнере приложений, это может не всегда быть разрешено.
  • Общий доступ к данным между процессами — imEs может потребоваться предоставить общий доступ к данным о входных предпочтениях пользователя между приложениями, которые находятся в разных контейнерах приложений. Используйте веб-службу для совместного использования данных между приложениями.

Внимание

Если вы пытаетесь обойти правила безопасности контейнера приложений, IME может рассматриваться как вредоносные программы и заблокированы.

IME и сенсорный клавиатура

IME должен убедиться, что пользовательский интерфейс области кандидатов и другие элементы пользовательского интерфейса не отображаются под сенсорной клавиатурой. Сенсорная клавиатура отображается в более высоком диапазоне z-порядка, чем все приложения, и ПОЛЬЗОВАТЕЛЬСКИЙ интерфейс IME отображается в той же полосе z-порядка, что и приложение, в котором он активен. В результате сенсорный клавиатура может перекрываться и скрывать ПОЛЬЗОВАТЕЛЬСКИЙ интерфейс IME. В большинстве случаев приложение должно изменить размер окна для учета сенсорной клавиатуры. Если приложение не изменяет размер, IME по-прежнему может использовать API InputPane для получения положения сенсорной клавиатуры. IME запрашивает свойство Location или регистрирует обработчик для событий отображения и скрытия сенсорной клавиатуры. Событие Show возникает каждый раз, когда пользователь нажимает на поле редактирования, даже если сенсорный клавиатура отображается в данный момент. IME может использовать этот API, чтобы получить пространство экрана, используемое сенсорной клавиатурой, прежде чем IME рисует кандидат (или другой) пользовательский интерфейс, а также для повторного изменения пользовательского интерфейса IMEs, чтобы избежать рисования под сенсорной клавиатурой.

Указание предпочтительного макета сенсорной клавиатуры

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

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

Все три классических макета предназначены для ввода традиционных китайских в разных формах:

  • Фонетические входные данные
  • Входные данные Changjie
  • Входные данные Dayi

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

Для использования этой функции IME необходимо реализовать интерфейс ITfFnGetPreferredTouchKeyboardLayout , экспортируемый IME с помощью API ITfFunctionProvider .

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

Если IME необходимо задать один из классических макетов в качестве предпочтительного макета, дополнительные трудоемкие действия не требуются на стороне IME, помимо поддержки интерфейсов ITfFnGetPreferredTouchKeyboardLayout и ITfFunctionProvider. Но дополнительная работа требуется в IME для работы с оптимизированными для сенсорного ввода макетами, и это описано в следующем разделе.

Оптимизированный для сенсорного ввода макет

Сенсорные клавиатуры для корейского, японского, упрощенного китайского и традиционного китайского входных языков отображают другой макет для режимов преобразования IME On и IME Off. На сенсорной клавиатуре есть клавиша, чтобы задать режим преобразования IME в значение "Вкл." или "Выкл.", но режим IME клавиатуры также может измениться при изменении фокуса между элементами управления редактированием.

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

Когда эти клавиши нажимаются, сенсорный клавиатура вызывает функцию SendInput для отправки следующих символов области частного использования Юникода в ориентированное приложение, с помощью которого IME может перехватывать и действовать:

  • Следующая страница (0xF003) — отправлена при нажатии клавиши с кандидатом на клавиатуре, оптимизированной для сенсорного ввода для японского и упрощенного китайского языка, или при нажатии следующей клавиши страницы на сенсорной оптимизированной клавиатуре для традиционного китайского языка.
  • Предыдущая страница (0xF004) — отправляется при нажатии клавиши с кандидатом на страницу одновременно с клавишей SHIFT на сенсорно-оптимизированной клавиатуре для японского и упрощенного китайского языка или при нажатии предыдущей клавиши страницы на сенсорно оптимизированной клавиатуре для традиционного китайского языка.

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

Чтобы перехватывать ввод клавиатуры, IME должен зарегистрировать в качестве приемника событий ключа. Для входных данных Юникода, создаваемых с помощью функции SendInput, параметр WPARAM обратного вызова ITfKeyEventSink (OnKeyDown, OnKeyUp, OnTestKeyDown, OnTestKeyUp, OnTestKeyUp) всегда содержит виртуальный ключ VK_PACKET и не определяет символ напрямую.

Реализуйте следующую последовательность вызовов для доступа к символу:

// Keyboard state
BYTE abKbdState[256];
if (!GetKeyboardState(abKbdState))
{
   return 0;
}

// Map virtual key to character code
WCHAR wch;
if (ToUnicode(VK_PACKET, 0, abKbdState, &wch, 1, 0) == 1)
{
   return wch;
}

Интеграция поиска IME

Предоставьте пользователям функции поиска через контракт поиска и интеграцию с областью поиска.

Предложения области поиска и IME
Предложения области поиска и IME

Область поиска — это центральное расположение для пользователей, которые выполняют поиск во всех своих приложениях. Для пользователей IME Windows предоставляет уникальный интерфейс поиска, который позволяет совместимым мгновенным сообщениями интегрироваться с Windows для повышения эффективности и удобства использования.

Пользователи, которые ввели IME, совместимые с поиском, получают два основных преимущества:

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

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

  • Совместим с оболочкой стиля Windows.
  • Реализуйте API режима TSF без пользовательского интерфейса. Дополнительные сведения см. в разделе "Обзор режима без пользовательского интерфейса".
  • Реализуйте API интеграции поиска TSF, ITfFnSearchCandidateProvider и ITfIntegratableCandidateListUIElement.

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

Кроме того, IME отправляет кандидатов, которые должны использоваться для выполнения текущего поиска. Эти кандидаты могут быть такими же, как и кандидаты на преобразование, или они могут быть адаптированы для поиска.

Хорошие кандидаты поиска соответствуют следующим критериям:

  • Префикс не перекрывается. Например, 北京大学 и北京 являются избыточными, так как один является префиксом другого.
  • Нет избыточных кандидатов. Любой избыточный кандидат не полезен для поиска, так как он не помогает фильтровать результаты. Например, любой результат, соответствующий 北京大学 также соответствует 北京.
  • Нет кандидата прогнозирования, только преобразование. Например, если пользователь вводит "be", IME может возвращать 北 в качестве кандидата, но не 北京大学. Как правило, кандидаты прогнозов слишком строги.

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

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

Если предоставляются альтернативные варианты, приложение должно рассматривать каждую альтернативу как запрос и возвращать все результаты, соответствующие любой из альтернативных вариантов. Приложение должно вести себя так, как если бы пользователь выпустил несколько запросов одновременно, по существу выдавая запрос "или" в службу, предоставляя результаты. Для соображений производительности приложения часто ограничивают соответствие между 5 и 20 наиболее подходящими альтернативами.

Рекомендации по проектированию пользовательского интерфейса

Все мгновенные сообщения должны соответствовать рекомендациям по пользовательскому интерфейсу, описанным в разделе "Проектирование и код приложений Windows".

Не используйте липкие окна

Окна IME должны отображаться только при необходимости, и они не должны отображаться все время. Если пользователям не нужно вводить тип, окна IME не должны отображаться. Окно IME не должно быть полноэкранным окном. Окна IME не должны перекрываться друг с другом. Окна должны быть разработаны в стиле Windows и следовать масштабированию пользовательского интерфейса.

Значки IME

Существует два типа значков IME, значков фирменной символики и значков режима. Все значки IME должны быть разработаны только с черными и белыми цветами. Новые значки IME заимствованы из глифического вида значков системной области. Этот стиль был создан, чтобы все языки могли использовать его для дополнения семейного вида, а также отличается друг от друга.

Формат файла для значков IME — ICO. Необходимо указать следующие размеры значков.

  • 16x16 пикселей
  • 20x20 пикселей
  • 24x24 пикселей
  • 32x32 пикселей
  • 40x40 пикселей
  • 48x48 пикселей

Убедитесь, что 32-разрядные значки с альфа-каналом предоставляются во всех разрешениях.

Значки фирменной символики IME определяются белым полем, в котором помещается типографический глиф, отображаемый в современном шрифте. Каждая определяющая глиф выбирается каждой языковой командой. Глиф черный. Поле включает внешний росчерк 1 пикселя в черном цвете на 50 % непрозрачности. Новые версии определяются округленным углом в верхнем левом углу поля.

Значки режима IME определяются белым типографическим глифом в современном шрифте, который включает внешний штрих 1 пикселя в черном цвете на 50 % непрозрачности.

Icon Description
Пример значка фирменной символки IME для традиционного китайского changeJie. Пример значка фирменной символки IME для традиционного китайского changeJie.
Пример значка фирменной символки IME для традиционного китайского нового changeJie. Пример значка фирменной символки IME для традиционного китайского changeJie.
Значок китайского режима Значок режима IME примера.

Окно с владельцем

Чтобы отобразить пользовательский интерфейс кандидата, IME должен задать его окно в качестве собственного окна, чтобы оно отображалось в текущем работающем приложении. Используйте метод ITfContextView::GetWnd, чтобы получить окно для владения. Если GetWnd возвращает ошибку или NULLHWND, вызовите функцию GetFocus .

if (FAILED(pView->GetWnd(&parentWndHandle)) || (parentWndHandle == nullptr)) { parentWndHandle = GetFocus(); }

Взаимодействие с окном кандидата IME с поверхностями закрытия света

Модель увольнения для всплывающих окон называется "светлое увольнение", так как это легко для пользователя закрыть такие окна. Для правильного функционирования imEs в модели взаимодействия с Windows окна IME должны участвовать в модели простого закрытия.

Чтобы участвовать в модели закрытия света, IME должен вызвать три новых события Windows с помощью функции NotifyWinEvent или аналогичной функции. Эти новые события:

  • EVENT_OBJECT_IME_SHOW — вызовите это событие, когда IME становится видимым.
  • EVENT_OBJECT_IME_HIDE . Вызов этого события при скрытии IME.
  • EVENT_OBJECT_IME_CHANGE — вызывает это событие при перемещении или изменении размера IME.

Объявление совместимости

ImEs объявляют, что они совместимы, регистрируя категорию GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT для их IME с помощью ITfCategoryMgr::RegisterCategory.

Установка режима IME по умолчанию

Мы предоставляем лучший пользовательский интерфейс для IMEs.

Поддержка масштабирования DPI для классических приложений

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

Так как IME выполняется в контексте процесса каждого приложения, вы не должны объявлять уровень осведомленности о DPI для IME. Это гарантирует, что IME выполняется на уровне осведомленности о DPI текущего процесса.

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

Примечание.

Чтобы обеспечить паритетность с новыми классическими приложениями, IME должен поддерживаться на каждый монитор —DPI осведомленности, но не должен объявлять уровень осведомленности. Система определяет соответствующие требования к масштабированию в каждом сценарии.

Дополнительные сведения о требованиях к поддержке масштабирования DPI для классических приложений см. в разделе "Высокий DPI".

Установка IME

Если вы создаете IME с помощью Microsoft Visual Studio, создайте интерфейс установки для IME с помощью стороннего установщика, например InstallShield из Flexera Software.

Ниже показано, как использовать InstallShield для создания проекта установки для библиотеки DLL IME.

  • Установить Visual Studio.
  • Запустите среду Visual Studio.
  • В меню "Файл" наведите указатель мыши на "Создать" и выберите "Проект". Появится диалоговое окно Создать проект.
  • В левой области перейдите к шаблонам других типов проектов > > установки и развертывания, нажмите кнопку "Включить installShield Limited Edition" и нажмите кнопку "ОК". Следуйте инструкциям по установке.
  • Перезапустите Visual Studio.
  • Откройте файл решения IME (.sln).
  • В Обозреватель решений щелкните правой кнопкой мыши решение, наведите указатель мыши на добавление и выберите новый проект. Откроется диалоговое окно "Добавить новый проект ".
  • В левом представлении дерева перейдите к шаблонам других типов проектов > > InstallShield Limited Edition.
  • В центральной окне щелкните InstallShield Limited Edition Project.
  • В текстовом поле "Имя" введите "SetupIME" и нажмите кнопку "ОК".
  • В диалоговом окне помощника по проекту щелкните "Сведения о приложении".
  • Введите имя вашей компании и другие поля.
  • Щелкните "Файлы приложений".
  • В левой области щелкните правой кнопкой мыши папку [INSTALLDIR] и выберите "Создать папку". Назовите папку "Подключаемые модули".
  • Нажмите кнопку "Добавить файлы". Перейдите к библиотеке DLL IME и добавьте ее в папку подключаемых модулей. Повторите этот шаг для словаря IME.
  • Щелкните правой кнопкой мыши библиотеку DLL IME и выберите "Свойства". Откроется диалоговое окно "Свойства ".
  • В диалоговом окне "Свойства" перейдите на вкладку "Параметры COM и .NET".
  • В разделе "Тип регистрации" выберите "Самостоятельная регистрация " и нажмите кнопку "ОК".
  • Постройте решение. Библиотека DLL IME создается, и InstallShield создает файл setup.exe, позволяющий пользователям устанавливать IME в Windows.

Чтобы создать собственный интерфейс установки, вызовите метод ITfInputProcessorProfileMgr::RegisterProfile для регистрации IME во время установки. Не записывайте записи реестра напрямую.

Если IME должен использоваться сразу после установки, вызовите InstallLayoutOrTip , чтобы добавить IME в методы ввода с поддержкой пользователя, используя следующий формат для параметра psz:

<LangID 1>:{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

Специальные возможности IME

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

  • Список кандидатов должен иметь UIA_AutomationIdPropertyId равным "IME_Candidate_Window " для списков кандидатов преобразования или "IME_Prediction_Window" для списков кандидатов прогнозов.
  • Когда список кандидатов отображается и исчезает, он вызывает события типа UIA_MenuOpenedEventId и UIA_MenuClosedEventId соответственно
  • При изменении текущего выбранного кандидата список кандидатов вызывает UIA_SelectionItem_ElementSelectedEventId. Выбранный элемент должен иметь свойство UIA_SelectionItemIsSelectedPropertyId равно TRUE.
  • UIA_NamePropertyId для каждого элемента в списке кандидатов должно быть именем кандидата. Кроме того, вы можете предоставить дополнительную информацию для диамбигуации кандидатов через UIA_HelpTextPropertyId.