Frage

Ich arbeite an einem WinCE 6.0-System mit einem Touchscreen, der seine Kalibrierungsdaten (x-y-Position, Offset usw.) in der Systemregistrierung (HKLM\HARDWARE OUCH) speichert.Im Moment füge ich die Cal-Werte in Registrierungsschlüssel ein, die zur Erstellungszeit in das Betriebssystem-Image eingefügt werden.Das funktioniert gut für den Monitor, von dem ich die ursprünglichen Kalibrierwerte erhalte, aber wenn ich dieses Bild in ein anderes System mit einem anderen Monitor lade, ist die Position des Touchscreen-Zeigers (verständlicherweise) falsch, da die beiden Monitore nicht die gleichen Kalibrierwerte haben .

Mein Problem ist, dass ich nicht weiß, wie ich Werte richtig in der Registrierung speichern kann, damit sie nach einem Aus- und Wiedereinschalten bestehen bleiben.Sehen Sie, ich kann den Bildschirm auf dem zweiten System neu kalibrieren, aber die neuen Werte sind nur im flüchtigen Speicher vorhanden.Ich schlug meinem Chef vor, dass wir unserem Kunden einfach sagen könnten, er solle das Gerät immer stromlos lassen – das kam nicht gut an.

Ich benötige Ratschläge zum Speichern der neuen Konstanten in der Registrierung, damit wir die Monitore einmal kalibrieren können, bevor wir sie an unseren Kunden versenden, und nicht für jede Einheit, die wir bauen, separate Betriebssystem-Images erstellen müssen.

Eine C#-Methode, die bekanntermaßen in CE6.0 funktioniert, wäre hilfreich.Danke.

-Odbasta

War es hilfreich?

Lösung

Ich denke, was Sie wahrscheinlich suchen, ist die Flush-Funktion der RegistryKey-Klasse.Dies ist normalerweise nicht nötig (die Registrierung ist faul-gespült standardmäßig), aber wenn die power ist ausgeschaltet, die auf dem Gerät, bevor das system eine chance hat, dies zu tun, werden die änderungen verworfen werden:

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

Diese Funktion ist verfügbar in .NET Compact Framework, version 2.0 und besser.

Andere Tipps

Follow-up auf diese Frage:

Dank DannySmurf, Spülen Sie den Registrierungsschlüssel war letztendlich das, was getan werden musste.Allerdings gab es ein paar Schritte, die ich fehlte vor erreichen dieses Stadium.So, hier ist, was kam zum Vorschein:

  • Ich war mit einem RAM-basierten Registrierung, wo durch Gestaltung der registry nicht bestehen, nach einem cold boot.Ich hatte das wechseln der registry hive-basierten.
  • Beim Wechsel zu einer hive-based registry-Struktur, die Sie benötigen, um sicherzustellen, dass der Bienenstock besteht, die auf einem nicht flüchtigen medium.Dies ist angegeben in der Plattform.reg-Datei:

    [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
    
  • Sobald das system.hv-Datei ist auf der Festplatte (CF-card in meinem Fall), die Werte in der Registrierung beibehalten wird, nachdem ein Kaltstart.Beachten Sie, dass der system.hv-Datei enthält alle HKLM-Tasten.

  • Es ist auch wichtig zu beachten, dass alle Treiber, die initialisiert werden müssen, auf-boot angegeben werden, die als solche in der .reg-Dateien der Lösung.Zum Beispiel hatte ich zu machen Sie sicher, dass die Festplatte Treiber (PCMCIA) wurden geladen werden, bevor versucht wird, Lesen Sie die system-hive-Datei von Ihnen.Der Weg, dies zu tun ist, um eine Richtlinie in die folgenden format, um jeden Fahrer init-Taste:

    ;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
    

Das, plus eine Menge Glück, ist zu es.

Wie ich verstanden habe, müssen Sie wissen, wie man einen Wert in der registry während der Laufzeit.Ich hoffe die codes Balg Ihnen helfen können.

mithilfe von 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;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top