如果您有受支持的触摸屏,Windows 7 上有一个实用程序可让您进行触摸校准。
可执行文件是 tabcal.exe,位于:
C:\Windows\System32
我正在寻找一种方法来从我的信息亭应用程序中自行处理此 exe 以:
- 重置校准数据
- 执行校准模式屏幕
该 exe 支持一些开关,但它们没有记录。我发现的一个开关是这样的:
tabcal lincal novalidate XGridPts={coords} YGridPts={coords}
我想知道是否有人可以帮助我找到重置校准数据的命令开关,其作用与进入控制面板并进入平板电脑设置然后单击“重置...”相同。
答案1
简短回答
tabcal.exe ClearCal DisplayID=\\.\DISPLAY1
长答案
你不会在tabcal.exe
任何地方找到命令行参数的官方列表,但我希望这对某些人有用。此信息由进程监控(我使用的实用程序是了解一个进程通过命令行参数被要求做什么以及它对其他进程、文件系统和注册表做了什么)和对 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
调用的目录中,名为“caldatan.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
重新启动用户进程时。(即使按顺序重新启动 Tablet PC 输入服务会停止并重新启动进程,也无法执行此wisptis.exe
操作。想想吧。)
一个更简单的方法是运行以下命令(需要提升),它会删除这些键并立即影响更改:
tabcal.exe ClearCal DeviceKind=touch DisplayID=\\.\DISPLAY1
这是用户在我的测试系统上从 Tablet PC 设置控制面板中选择“重置...”时运行的确切命令。如果您有笔输入设备或不同的显示配置,您的命令可能会略有不同。(如果您启用了 UAC,在允许重置操作之前,您可以打开“详细信息”窗格查看要执行的完整命令行。或者,您可以从进程监控。
正如您已经确定的那样,您可以根据显示器的尺寸和特定要求,使用以下命令之一的衍生命令重新校准触摸屏:
# 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
答案2
我浏览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
答案3
附加信息:
在 Windows 10 上,您无需重新启动 wisptis.exe,而是必须终止 DWM.exe(它会自动重新启动)以使注册表中的新值生效(如果您不使用 TabCal.exe)。
还要注意的是,如果您在注册表中手动更改校准数据,则应该发出 Windows 消息 SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, "TabletPCDigitizerMappingChanged"),就像 TabCal 一样,通知任何客户端校准值已更改。
答案4
我想对这些信息表示感谢,它对我们的 Win10 IOT Enterprise 触摸屏应用程序非常有用。我真的不敢相信 5 年来关于这个问题的信息仍然很少......我们的一些定制触摸屏已经粘合在一起,略有偏移 - 我以为在我们的 WPF 信息亭应用程序中调整触摸位置会很容易,但是,运行 tabcal.exe 似乎是唯一的方法。我以为在触摸或鼠标点击之前,我可以更改或覆盖触摸位置的注册表项,但我找不到类似的东西。
我最终设法在 VS 中创建了一个控制台应用程序,该应用程序使用必要的选项运行 tabcal.exe。我现在可以使用它来关闭 UWF、重新启动、运行调用 tabcal.exe 的应用程序、校准屏幕、重新打开 UWF,然后重新启动回信息亭应用程序。
对于那些有兴趣解决从 WPF/C# 运行 tabcal.exe 时出现“系统找不到指定的文件”问题的人来说,这可能会对您有所帮助:
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = @"C:\Windows\Sysnative\tabcal.exe";
processInfo.Arguments = @"clearcal DisplayID=\\.\DISPLAY1";
processInfo.WorkingDirectory = @"C:\Windows\Sysnative";
processInfo.ErrorDialog = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = false;
processInfo.RedirectStandardError = false;
Process proc = Process.Start(processInfo);
proc.WaitForExit();
processInfo = new ProcessStartInfo();
processInfo.FileName = @"C:\Windows\Sysnative\tabcal.exe";
// these arguments give a 100px cal border on the 1280x800 Touchscreens
processInfo.Arguments = @"lincal novalidate DisplayID=\\.\DISPLAY1 DeviceKind=touch XGridPts=99,1179 YGridPts=99,699";
processInfo.WorkingDirectory = @"C:\Windows\Sysnative";
processInfo.ErrorDialog = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = false;
processInfo.RedirectStandardError = false;
proc = Process.Start(processInfo);
proc.WaitForExit();
因此,这将清除现有的校准数据,然后运行具有 4 个点的校准屏幕。关键点是:
将用于调用 tabcal.exe 的应用程序设置为 32 位(不确定这是否绝对必要)
添加 app.manifest 并设置:<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
请注意使用C:\Windows\Sysnative\
而不是C:\Windows\System32
显然 Windows 认为您应该使用C:\Windows\SysWOW64
并为您更改目录但随后在该文件夹中找不到 tabcal.exe 因此崩溃。