1

В Windows 7 есть утилита, которая позволяет выполнять сенсорную калибровку, если у вас есть поддерживаемый сенсорный экран.

Это исполняемый файл tabcal.exe, расположенный в:

C:\Windows\System32

Я ищу способ оболочки этого exe самостоятельно из моего приложения киоска для:

  1. Сброс калибровочных данных
  2. Выполнить экран режима калибровки

Exe поддерживает некоторые ключи, но они не задокументированы. Однажды переключатель, который я нашел, был таким:

tabcal lincal novalidate XGridPts={coords} YGridPts={coords}

Я хотел бы знать, может ли кто-нибудь помочь мне найти командные переключатели для сброса калибровочных данных, которые будут работать так же, как переходить на панель управления и переходить в настройки планшетного ПК, а затем нажимать «Сброс».

4 ответа4

3

Короткий ответ

tabcal.exe ClearCal DisplayID=\\.\DISPLAY1

Длинный ответ

Официального списка параметров командной строки для tabcal.exe вы не найдете нигде, но я надеюсь, что это кому-нибудь пригодится. Эта информация предоставляется вам Process Monitor (моя утилита для перехода к пониманию того, что процессу было сказано делать через аргументы командной строки, а также что он делает с другими процессами, файловой системой и реестром) и свободным использованием Google.

Вот то, что я считаю, я понял:

ClearCal

              сбрасывает данные калибровки для данного устройства
              требуется DisplayID

LinCal

              запускает калибровку
              (если ClearCal не указан, по умолчанию используется функция LinCal)
              требуется DisplayID если у вас есть несколько устройств с пером и / или сенсорными возможностями
              может потребоваться DeviceKind если у вас есть и перьевой и сенсорный дигитайзеры на одном дисплее

DisplayID=\\.\DISPLAY1

              индекс на основе одного дисплея, связанный с сенсорным экраном
              (Если у вас есть два дисплея, это 1 или 2; значение соответствует идентификационному номеру мульти-дисплея на панели управления дисплеем)

Quiet

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

DeviceKind={touch,pen}

              На первый взгляд необязательный аргумент для ClearCal и LinCal для указания типа дигитайзера
              (Я подозреваю, что это может потребоваться, если вы используете оба на одном дисплее, но мой дигитайзер поддерживает только сенсорный.)

{validate,novalidate}

              Необязательный аргумент для LinCal чтобы предотвратить или принять регистрацию калибровочных меток, которые находятся далеко от перекрестия
              Если не указано, по умолчанию действует validate

XGridPts=
YGridPts=

              Необязательные аргументы (если используются оба обязательных) для LinCal для указания координат X и Y перекрестия для калибровки.
              Значения представляют собой список, разделенный запятыми, без пробелов в координатах пикселей, начинающихся с нуля.
              (например, для 1920 × 1080, значения X дисплея 0-1919 и значения Y 0-1079 принимаются; некоторые примеры приведены ниже)
              Если не указано, калибровочные точки по умолчанию равны четырем, если не указано иное (значения извлекаются из HKLM:\SYSTEM\CurrentControlSet\Control\TabletPC\LinearityData)

Export

              Необязательный аргумент для LinCal для экспорта данных калибровки в файл.
              Выходной файл находится в каталоге, из которого был вызван tabcal , с именем 'caldata n.txt', где n - это нулевое значение с автоприращением
              Содержимое файла - это имя дигитайзера, разрыв строки и та же шестнадцатеричная строка, записанная в значение реестра в HKLM:\SYSTEM\CurrentControlSet\Control\TabletPC\LinearityData
              (Я не нашел соответствующей функции импорта.)

Другие вещи, которые я узнал

Существует три подраздела реестра, которые содержат данные калибровки:

  • HKLM:\SYSTEM\CurrentControlSet\Control\TabletPC\LinearityData
  • HKLM:\SYSTEM\CurrentControlSet\Control\TabletPC\UserLinearityData
  • HKLM:\SYSTEM\CurrentControlSet\Enum\HID\VID_xxxx&&PID_xxxx&Colxx\(non-deterministic)\Device Parameters

Первые два могут содержать двоичное значение с именем vid_xxxxpid_xxxx&colxx содержащее данные калибровки для этого конкретного устройства, а также значения XGridPts и YGridPts, если вы калибровали более 4 точек касания.

Подраздел Enum\HID , имеющий в своем имени те же значения VID/PID/Col и значение LinearityData будет иметь значение LinearityData с теми же данными, что и выше.

Если вы удалите все эти значения реестра, вы сбросите данные калибровки, но это изменение не вступит в силу до тех пор, пока эти данные не будут снова считаны системой, либо при последующей загрузке, либо когда пользовательский процесс wisptis.exe перезапущен. (Обычный перезапуск службы ввода планшетного ПК не делает этого, даже если он останавливает и перезапускает процессы wisptis.exe . Пойди разберись.)

Гораздо проще сделать это, выполнив следующую команду (которая требует повышения прав), которая удаляет эти ключи и немедленно вносит изменения:

tabcal.exe ClearCal DeviceKind=touch DisplayID=\\.\DISPLAY1

Это именно та команда, которая запускается, когда пользователь выбирает «Сброс» на панели управления настройками планшетного ПК в моей тестовой системе. Если у вас есть устройство ввода с пером или другая конфигурация дисплея, ваша команда может немного отличаться. (Если у вас включено UAC, прежде чем разрешить действие «Сброс», вы можете открыть панель «Подробности», чтобы увидеть полную командную строку, которую нужно выполнить. Кроме того, вы можете получить эту информацию из Process Monitor.)

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

# Default touch calibration (4 points unless someone's previously specified XGridPts/YGridPts)
tabcal.exe lincal novalidate devicekind=touch
tabcal.exe lincal novalidate devicekind=pen

# Example 25-point touch calibration for 1920×1080 display
tabcal.exe lincal novalidate devicekind=touch XGridPts=10,485,960,1435,1910 YGridPts=10,275,540,805,1070

# Example 121-point pen calibration (from a Microsoft Surface forum)
tabcal.exe lincal novalidate devicekind=pen XGridPts=10,60,110,360,660,960,1260,1560,1810,1860,1910 YGridPts=10,60,110,200,330,490,650,810,970,1020,1070
1

Я запустил tabcal через strings . В списке ниже могут быть возможные переключатели. Я не знаю, что они делают.

LinCal
ShowCursor
Quiet
NoValidate
SaveFiles
Export
UserLinCal
ClearCal
NoDesktop
XInterval=
YInterval=
XGridPts=
YGridPts=
DeviceName=
DevicePath=
DisplayID=
DeviceKind=
UserSid=
UserSid=%s %s
RunAs
TabCalSingleInstance
1

Большое спасибо всем за работу в этой теме! Я смог использовать эту информацию для решения проблемы инверсии оси Y с новым сенсорным экраном. Я создал пользовательский калибровочный тест, используя следующий код:

tabcal lincal novalidate DeviceKind=touch DisplayID=\\.\DISPLAY1 XGridPts=99,1265 YGridPts=99,667

Это успешно инвертировало мои точки оси Y и позволило мне нормально использовать новый сенсорный экран. Это использовалось на дисплее 1366 на 768, поэтому редактируйте в соответствии с вашим размером дисплея.

1

Дополнительная информация:

В Windows 10 вместо перезапуска wisptis.exe необходимо убить DWM.exe (он перезапускается автоматически), чтобы новые значения из реестра вступили в силу (если вы не используете TabCal.exe).

Также следует отметить, что если вы изменяете данные калибровки вручную в реестре, вы должны выдать сообщение Windows SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, "TabletPCDigitizerMappingChanged"), так как TabCal уведомляет любого клиента об изменении значений калибровки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .