Domanda

Sto lavorando su un WinCE 6.0 del sistema con un touchscreen che memorizza i dati di calibrazione (x-y posizione, offset, etc.) nel registro di sistema (HKLM\HARDWARE OUCH).Proprio ora, sto mettendo il cal valori nelle chiavi di registro che vengono messi in l'immagine del sistema operativo in fase di compilazione.Che funziona bene per il monitor che ho l'originale cal valori, ma quando carico l'immagine in un altro sistema con un altro monitor, il touchscreen posizione del puntatore è (comprensibilmente), perché i due monitor non hanno lo stesso cal valori.

Il mio problema è che non so come conservare correttamente i valori nel registro di sistema, in modo che essi persistono anche dopo un ciclo di alimentazione.Vedi, posso ricalibrare lo schermo il secondo sistema, ma i nuovi valori esistono solo nella memoria volatile.Ho suggerito al mio capo che possiamo raccontare ai nostri clienti di lasciare il potere su l'unità di tutti i tempi-che non va più bene.

Ho bisogno di un consiglio su come salvare il nuovo costanti nel registro di sistema, in modo che siamo in grado di calibrare il monitor una volta prima della spedizione fuori per il nostro cliente, e non separare il sistema operativo di immagini per ogni unità di costruire.

Un metodo C# che è noto per lavorare in CE6.0 sarebbe utile.Grazie.

-Odbasta

È stato utile?

Soluzione

Penso che quello che probabilmente stai cercando è il Filo funzione della classe RegistryKey.Questo di solito non è necessario (il registro è progressivamente svuotato di default), ma se l'alimentazione è disattivata sul dispositivo prima che il sistema ha la possibilità di fare questo, le modifiche verranno scartati:

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

Questa funzione è disponibile in .NET Compact Framework versione 2.0 e meglio.

Altri suggerimenti

Follow-up su questa questione:

Grazie DannySmurf, vampate di calore la chiave di registro è stata, in definitiva, che cosa doveva essere fatto.Tuttavia, ci sono stati un paio di passaggi che mi mancava, prima di arrivare a questo punto.Quindi, ecco quello che è venuto alla luce:

  • Stavo usando una RAM di base del registro di sistema, dove disegno del registro di sistema non persistono dopo un avvio a freddo.Ho dovuto cambiare il registro di sistema basati su hive.
  • Quando si passa ad una basati su hive del registro di sistema struttura, è necessario assicurarsi che l'alveare esiste un non-volatile di supporto.Questo è specificato nella piattaforma.reg file:

    [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
    
  • Una volta che il sistema.hv file sul disco rigido, scheda CF nel mio caso), i valori nel registro di sistema, persistono dopo un avvio a freddo.Si noti che il sistema.hv file contiene tutte le HKLM chiavi.

  • E ' anche importante notare che tutti i driver che devono essere inizializzate all'avvio deve essere indicato come tale nel .reg file della soluzione.Per esempio, ho dovuto assicurarsi che i driver del disco rigido (PCMCIA) sono stati caricati prima di tentare di leggere l'hive di sistema di file.Il modo per farlo è quello di aggiungere una direttiva nel seguente formato intorno a ogni driver init chiave:

    ;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
    

Che, oltre a un sacco di fortuna, è su di esso.

Come ho capito hai bisogno di sapere come impostare un valore del registro di sistema durante l'esecuzione.Spero che i codici a soffietto può aiutare.

utilizzo di 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;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top