3

システム レジストリ (HKLM\HARDWARE\TOUCH) にキャリブレーション データ (xy 位置、オフセットなど) を保存するタッチスクリーンを備えた WinCE 6.0 システムで作業しています。現在、ビルド時に OS イメージに入れられるレジストリ キーに cal 値を入れています。元のキャリブレーション値を取得したモニターでは問題なく動作しますが、この画像を別のモニターを備えた別のシステムにロードすると、2 つのモニターのキャリブレーション値が同じではないため、タッチスクリーン ポインターの位置が (当然のことながら) オフになります。 .

私の問題は、値をレジストリに適切に保存して、電源を入れ直した後も値が保持されるようにする方法がわからないことです。ほら、2 番目のシステムで画面を再調整できますが、新しい値は揮発性メモリにしか存在しません。私は上司に、ユニットの電源を常にオンにしておくように顧客に伝えることができると提案しましたが、うまくいきませんでした.

新しい定数をレジストリに保存する方法についてアドバイスが必要です。これにより、モニターを顧客に出荷する前に一度調整でき、構築するユニットごとに個別の OS イメージを作成する必要がなくなります。

CE6.0 で動作することが知られている AC# メソッドが役立ちます。ありがとう。

-オドバスタ

4

3 に答える 3

5

この質問のフォローアップ:

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) からシステム ハイブ ファイルを読み取ろうとする前に、それらが読み込まれていることを確認する必要がありました。これを行う方法は、各ドライバーの初期化キーの周りに次の形式でディレクティブを追加することです。

    ;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
    

それだけでなく、多くの運もあります。

于 2008-09-12T21:22:22.860 に答える
3

おそらく探しているのは、RegistryKey クラスの Flush 関数だと思います。これは通常は必要ありません (レジストリはデフォルトで遅延フラッシュされます) が、システムがこれを行う前にデバイスの電源が切られた場合、変更は破棄されます:

http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.flush.aspx

この関数は、.NET Compact Framework バージョン 2.0 以降で使用できます。

于 2008-09-11T23:55:48.863 に答える
0

私が理解したように、実行時にレジストリに値を設定する方法を知る必要があります。以下のコードがお役に立てば幸いです。

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;
    }
于 2008-09-15T20:28:03.277 に答える