RAM-based Registy方式下触摸信息保存和重置一种思路

本文介绍了一种触摸屏校准数据通过文件形式进行保存与恢复的方法,包括自定义保存位置、读取与应用校准数据的流程,以及系统启动时的注册表导入与事件触发机制。

在此种方式下,因为注册表信息重启后就没有了,所以相应的触摸校准信息也会丢失并恢复到出厂值。对于保存可以由应用在校准后读出来保存到外部文件,这个容易实现。不过对于重置,因为触摸信息是由gwes加载并生效的,因此就算应用从文件中读取并设置注册表也没有效果。对于触摸校准gwes会调用一个TouchCalibrateUI_Done来使校准有效,但是它不对应用开放,在网上找到了一个思路觉得可行,只是没有验证。
CalibrUi.lib作为gwes的一部分,在sysgen时被组装进gwes.exe;修改calibrui.cpp,在其中加入判断代码,如果应用程序调用TouchCalibrate()进行校正之前设置了一个指定名字的事件,则calibrui.lib不再重新校正,而是直接从注册表中恢复校正数据,否则进行再次校正;具体修改为:在函数TouchCalibrateUI_DrawMainScreen中加入判断,如果不需要重新校正就直接返回;在函数TouchCalibrateUI_HandleUserInputMessage中加入判断,如果不需要重新校正则调用TouchCalibrateRestoreFromRegistry()和TouchCalibrationAbort(),然后返回;这样,注册表中的校正数据就会被gwes重新读取,应用程序在这之前可以从文件中读取校正数据到注册表中,从而实现触摸屏校正数据的文件形式保存
引用自:http://xiaoxiongwinnie.blogbus.com/logs/30161249.html

==========================================================
又找到了另外一种实现思路

第一步,定义自定义触摸屏校准值保存的注册表位置

#define PSCAL_REGPATH L"SOFTWARE\\ANYCOMPAY\\TOUCH"
#define CALDATA_REGVAL L"CalibrationData"


第二步,在D:\WINCE600\PLATFORM\FreeScale51\COMMON\SRC\SOC\COMMON_FSL_V2\TOUCH\.\tchmain.c中添加如下函数,从指定位置读取五个样点的位置

static ULONG
GetPsTouchCalData(int* iUncalX,int* iUncalY)
{
HKEY hKey;
BOOL bReadOk=FALSE;
WCHAR tcCalData[64]=L"524,523 796,244 796,808 252,809 258,233";

if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE, PSCAL_REGPATH, 0,KEY_READ, &hKey))
{
DWORD dwLen = sizeof(tcCalData);
if(ERROR_SUCCESS==RegQueryValueEx(hKey, CALDATA_REGVAL, NULL, NULL, (LPBYTE)tcCalData, &dwLen))
{
   bReadOk = TRUE;
}
RegCloseKey(hKey);
}
if(bReadOk)
{
//524,523 796,244 796,808 252,809 258,233
swscanf(tcCalData,L"%d,%d %d,%d %d,%d %d,%d %d,%d",(iUncalX+0),(iUncalY+0),(iUncalX+1),(iUncalY+1),
   (iUncalX+2),(iUncalY+2) ,(iUncalX+3),(iUncalY+3),(iUncalX+4),(iUncalY+4));
}
return bReadOk;
}

第三步,在D:\WINCE600\PLATFORM\FreeScale51\COMMON\SRC\SOC\COMMON_FSL_V2\TOUCH\.\tchmain.c中添加如下线程函数,等待事件,执行应用自定义触摸屏校准值

#define POT_NUM 5
static ULONG
TouchApplyRegistryData(
    PVOID   Reserved //@parm Reserved, not used.
    )
{
BOOL bStop=FALSE;
//五个点分别为中,左上,左下,右下,右上
//实例屏幕尺寸为800*640
int iScreenX[POT_NUM] = {400,160,160,640,640};//(1/2 1/5 1/5 4/5 4/5)*width
int iScreenY[POT_NUM] = {240,96,384,384,96}; //(1/2 1/5 4/5 4/5 1/5)*higth
int iUncalX[POT_NUM] = {0};
int iUncalY[POT_NUM] = {0};
HANDLE hSetApplyEvent = CreateEvent( NULL, FALSE,FALSE, L"APPLY_CAL_REGISTRY");
UNREFERENCED_PARAMETER(Reserved);
RETAILMSG(TRUE,(L"Go into TouchApplyRegistryData ...............................\r\n"));
while(!bStop)
{
WaitForSingleObject( hSetApplyEvent, INFINITE);
if(GetPsTouchCalData(iUncalX,iUncalY))
{
   TouchPanelSetCalibration(POT_NUM,iScreenX,iScreenY,iUncalX,iUncalY);
   RETAILMSG(TRUE,(L"TouchApplyRegistryData call Finished ...............................\r\n"));
}
}
CloseHandle(hSetApplyEvent);
ExitThread(1);
    return ( TRUE );
}

如何确定取样点屏幕的坐标位置,在TouchPanelReadCalibrationPoint中最后打印RETAILMSG(TRUE,(L"TouchPanelReadCalibrationPoint : %d %d\r\n",*pRawX,*pRawY));
即可知道校准时系统取了那几个样点及其具体屏幕坐标,也就是TouchPanelSetCalibration函数的第二个和第三个参数,我得出的结论是,五个点的时候规律为:

X:(1/2 1/5 1/5 4/5 4/5)*width
Y:(1/2 1/5 4/5 4/5 1/5)*higth

第四步,在D:\WINCE600\PLATFORM\FreeScale51\COMMON\SRC\SOC\COMMON_FSL_V2\TOUCH\.\tchmain.c中TouchPanelEnable函数中添加如下代码,启动第三部中的线程
hSetApplyThread = CreateThread( NULL, 0, TouchApplyRegistryData, 0, 0, NULL);

第五步,在应用程序调用TouchCalibrate 后,将系统默认保存的cal值(HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH)复制到自定义保存的位置(PSCAL_REGPATH)
   并将"SOFTWARE\\ANYCOMPAY"下的注册表全部保存到SD或Flash,存储为abc.reg.

第六步,系统每次起来后将abc.reg导入到系统注册表中,并发送”"APPLY_CAL_REGISTRY"“event到touch驱动,触发驱动更新自定义cal值

引用自:http://hi.baidu.com/cqit2001/blog/item/d0a547fc1a64a78db801a062.html

<think>好的,我现在需要回答用户关于Windows注册表中“appcompatflags”设置的问题。首先,我需要确认用户提到的“appcompatflags”具体指的是什么,以及它在注册表中的位置作用。 根据我的知识,AppCompat(应用程序兼容性)是Windows用来解决旧版应用程序在新系统上运行问题的一种机制。注册表中的AppCompatFlags设置通常用于配置应用程序的兼容性模式,例如强制以特定Windows版本或设置运行程序。 接下来,我应该确定用户可能的意图。他们可能遇到了兼容性问题,想手动调整设置,或者好奇这些设置的作用。需要确保回答结构清晰,分步骤解释,同时提醒用户谨慎修改注册表,因为错误操作可能导致系统不稳定。 首先,介绍AppCompatFlags的基本概念作用,然后说明注册表中的具体位置,例如HKEY_LOCAL_MACHINEHKEY_CURRENT_USER下的路径。接着,详细说明常见的键值类型,比如DWORD值或字符串值,以及它们对应的功能,比如禁用高DPI缩放或兼容性模式。 还需要提到兼容性疑难解答工具,作为更安全的替代方案,避免用户直接修改注册表。同时,强调修改注册表的风险,建议备份或创建系统还原点。 最后,总结关键点,确保用户理解操作的重要性潜在风险。检查是否有遗漏的信息,比如具体的路径示例或常见的兼容性标志名称,确保技术细节准确无误,并且用中文清晰表达。</think>在Windows系统中,`AppCompatFlags`(应用程序兼容性标志)是注册表中的一组设置,用于解决旧版本应用程序在新版Windows上的兼容性问题。以下是逐步说明: --- ### 1. **AppCompatFlags的作用** - 通过修改程序运行时的环境参数,绕过兼容性错误(如版本检测、DPI缩放问题等) - 常见应用场景: - 强制程序以管理员身份运行 - 禁用高DPI缩放 - 模拟旧版Windows系统行为(如Windows XP兼容模式) --- ### 2. **注册表位置** - **全局设置**(所有用户生效): ``` HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers ``` - **用户级设置**(仅当前用户生效): ``` HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers ``` --- ### 3. **键值类型与示例** - **键名**:应用程序的完整路径(例如`C:\Program Files\OldApp\app.exe`) - **键值**:字符串类型,包含兼容性标志组合,多个标志用空格分隔: - `RUNASADMIN` - 以管理员身份运行 - `HIGHDPIAWARE` - 禁用DPI缩放适配 - `WINXPSP3` - 模拟Windows XP SP3环境 - `DISABLETHEMES` - 禁用视觉主题 --- ### 4. **操作风险与建议** - **风险**:错误修改注册表可能导致程序崩溃或系统不稳定 - **建议操作**: 1. 优先使用系统自带的**兼容性疑难解答**(右键程序 → 属性 → 兼容性) 2. 修改注册表前**备份相关分支** 3. 创建系统还原点 --- ### 5. **替代方案** - 使用官方工具[Application Compatibility Toolkit (ACT)](https://learn.microsoft.com/en-us/windows/deployment/planning/act-technical-reference)管理兼容性设置 - 通过组策略配置企业级兼容性规则 如果需要具体问题的排查方法,请提供更多细节(如错误提示或程序名称)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值