C# アプリを使用して WinCE にレジストリ値を保存する
-
09-06-2019 - |
質問
私は、キャリブレーション データ (X-Y 位置、オフセットなど) をシステム レジストリ (HKLM\HARDWARE OUCH) に保存するタッチスクリーンを備えた WinCE 6.0 システムで作業しています。現在、ビルド時に OS イメージに組み込まれるレジストリ キーに cal 値を配置しています。元の校正値を取得したモニターではこれで問題ありませんが、この画像を別のモニターを備えた別のシステムに読み込むと、2 つのモニターの校正値が同じではないため、タッチスクリーン ポインタの位置が (当然のことながら) ずれてしまいます。 。
私の問題は、電源を入れ直しても値が保持されるように、値をレジストリに適切に保存する方法がわからないことです。2 番目のシステムで画面を再調整できますが、新しい値は揮発性メモリにのみ存在します。私は上司に、顧客にユニットの電源を常にオンにしたままにするように伝えればよいと提案しましたが、それはうまくいきませんでした。
新しい定数をレジストリに保存する方法についてアドバイスが必要です。これにより、モニターを顧客に出荷する前に一度調整することができ、構築するユニットごとに個別の OS イメージを作成する必要がなくなります。
CE6.0 で動作することがわかっている C# メソッドが役に立ちます。ありがとう。
-オドバスタ
解決
おそらくあなたが探しているのは、RegistryKey クラスの Flush 関数だと思います。これは通常は必要ありません (レジストリはデフォルトで遅延フラッシュされます) が、システムがこれを実行する前にデバイスの電源がオフになった場合、変更は破棄されます。
http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.flush.aspx
この関数は、.NET Compact Framework バージョン 2.0 以降で使用できます。
他のヒント
この質問のフォローアップ:
DannySmurf さん、ありがとう。最終的にはレジストリ キーをフラッシュする必要がありました。ただし、その段階に到達するまでにいくつかのステップが欠けていました。そこで、次のことが明らかになりました。
- RAM ベースのレジストリを使用していましたが、仕様上、コールド ブート後にレジストリは保持されません。レジストリをハイブベースに切り替える必要がありました。
ハイブ ベースのレジストリ構造に切り替える場合は、ハイブが不揮発性メディア上に存在することを確認する必要があります。これは、platform.reg ファイルで指定されます。
[HKEY_LOCAL_MACHINE\init\BootVars] "SystemHive"="\\Hard Disk\\system.hv" "ProfileDir"="\\Documents and Settings" "RegistryFlags"=dword:1 ; Flush hive on every RegCloseKey call "SystemHiveInitialSize"=dword:19000 ; Initial size for hive-registry file "Start DevMgr"=dword:1
system.hv ファイルがハードディスク (私の場合は CF カード) に保存されると、レジストリ内の値はコールド ブート後も保持されます。system.hv ファイルにはすべての HKLM キーが含まれていることに注意してください。
起動時に初期化する必要があるドライバーは、ソリューションの .reg ファイル内でそのように指定する必要があることに注意することも重要です。たとえば、ハード ディスク ドライバー (PCMCIA) からシステム ハイブ ファイルを読み込む前に、ハード ディスク ドライバー (PCMCIA) がロードされていることを確認する必要がありました。これを行うには、各ドライバー初期化キーの周囲に次の形式でディレクティブを追加します。
;HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\Drivers\PCCARD\PCMCIA\TEMPLATE\PCMCIA] "Dll"="pcmcia.dll" "NoConfig"=dword:1 "IClass"=multi_sz:"{6BEAB08A-8914-42fd-B33F-61968B9AAB32}=PCMCIA Card Services" "Flags"=dword:1000 ;END HIVE BOOT SECTION
それと、多くの幸運があれば、それだけです。
理解したように、実行時にレジストリに値を設定する方法を知る必要があります。以下のコードがお役に立てば幸いです。
Microsoft.Win32 を使用します。
/// <summary>
/// store a key value in registry. if it don't exist it will be created.
/// </summary>
/// <param name="mainKey">the main key of key path</param>
/// <param name="subKey">the path below the main key</param>
/// <param name="keyName">the key name</param>
/// <param name="value">the value to be stored</param>
public static void SetRegistry(int mainKey, String subKey, String keyName, object value)
{
if (mainKey != CURRENT_USER && mainKey != LOCAL_MACHINE)
{
throw new ArgumentOutOfRangeException("mainKey", "\'mainKey\' argument can only be AppUtils.CURRENT_USER or AppUtils.LOCAL_MACHINE values");
}
if (subKey == null)
{
throw new ArgumentNullException("subKey", "\'subKey\' argument cannot be null");
}
if (keyName == null)
{
throw new ArgumentNullException("keyName", "\'keyName\' argument cannot be null");
}
const Boolean WRITABLE = true;
RegistryKey key = null;
if (mainKey == CURRENT_USER)
{
key = Registry.CurrentUser.OpenSubKey(subKey, WRITABLE);
if (key == null)
{
key = Registry.CurrentUser.CreateSubKey(subKey);
}
}
else if (mainKey == LOCAL_MACHINE)
{
key = Registry.LocalMachine.OpenSubKey(subKey, WRITABLE);
if (key == null)
{
key = Registry.LocalMachine.CreateSubKey(subKey);
}
}
key.SetValue(keyName, value);
}
/// <summary>
/// find a key value in registry. if it don't exist the default value will be returned.
/// </summary>
/// <param name="mainKey">the main key of key path</param>
/// <param name="subKey">the path below the main key</param>
/// <param name="keyName">the key name</param>
/// <param name="defaultValue">the value to be stored</param>
public static object GetRegistry(int mainKey, String subKey, String keyName, object defaultValue)
{
if (mainKey != CURRENT_USER && mainKey != LOCAL_MACHINE)
{
throw new ArgumentOutOfRangeException("mainKey", "\'mainKey\' argument can only be AppUtils.CURRENT_USER or AppUtils.LOCAL_MACHINE values");
}
if (subKey == null)
{
throw new ArgumentNullException("subKey", "\'subKey\' argument cannot be null");
}
if (keyName == null)
{
throw new ArgumentNullException("keyName", "\'keyName\' argument cannot be null");
}
RegistryKey key = Registry.CurrentUser.OpenSubKey(subKey);
if (mainKey == CURRENT_USER)
{
key = Registry.CurrentUser.OpenSubKey(subKey);
}
else if (mainKey == LOCAL_MACHINE)
{
key = Registry.LocalMachine.OpenSubKey(subKey);
}
object result = defaultValue;
if (key != null)
{
result = key.GetValue(keyName, defaultValue);
}
return result;
}