Pergunta

Estou trabalhando em um sistema WinCE 6.0 com tela sensível ao toque que armazena seus dados de calibração (localização xy, deslocamento, etc.) no registro do sistema (HKLM\HARDWARE OUCH).No momento, estou colocando os valores cal em chaves de registro que são colocadas na imagem do sistema operacional no momento da compilação.Isso funciona bem para o monitor do qual obtenho os valores de calibração originais, mas quando carrego esta imagem em outro sistema com um monitor diferente, a localização do ponteiro da tela sensível ao toque está (compreensivelmente) desligada, porque os dois monitores não têm os mesmos valores de calibração .

Meu problema é que não sei como armazenar valores adequadamente no registro para que eles persistam após um ciclo de energia.Veja, posso recalibrar a tela no segundo sistema, mas os novos valores só existem na memória volátil.Sugeri ao meu chefe que poderíamos simplesmente dizer ao nosso cliente para deixar a unidade ligada o tempo todo - isso não funcionou bem.

Preciso de conselhos sobre como salvar as novas constantes no registro, para que possamos calibrar os monitores uma vez antes de enviá-los ao nosso cliente e não precisarmos criar imagens de sistema operacional separadas para cada unidade que construímos.

Um método C# que funciona no CE6.0 seria útil.Obrigado.

-Odbasta

Foi útil?

Solução

Acho que o que você provavelmente está procurando é a função Flush da classe RegistryKey.Normalmente, isso não é necessário (o registro é liberado lentamente por padrão), mas se a energia do dispositivo for desligada antes que o sistema tenha a chance de fazer isso, as alterações serão descartadas:

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

Esta função está disponível no .NET Compact Framework versão 2.0 e superior.

Outras dicas

Acompanhamento desta questão:

Obrigado DannySmurf, liberar a chave de registro era o que precisava ser feito.No entanto, faltavam algumas etapas antes de chegar a esse estágio.Então, aqui está o que veio à tona:

  • Eu estava usando um registro baseado em RAM, onde, por design, o registro não persiste após uma inicialização a frio.Tive que mudar o registro para baseado em Hive.
  • Ao mudar para uma estrutura de registro baseada em hive, você precisa ter certeza de que o hive existe em um meio não volátil.Isso é especificado no arquivo 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
    
  • Assim que o arquivo system.hv estiver no disco rígido (cartão CF no meu caso), os valores no registro persistirão após uma inicialização a frio.Observe que o arquivo system.hv contém todas as chaves HKLM.

  • Também é importante observar que quaisquer drivers que precisem ser inicializados na inicialização deverão ser especificados como tal nos arquivos .reg da solução.Por exemplo, tive que ter certeza de que os drivers de disco rígido (PCMCIA) estavam carregados antes de tentar ler o arquivo hive do sistema a partir deles.A maneira de fazer isso é adicionar uma diretiva no seguinte formato ao redor de cada chave de inicialização do driver:

    ;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
    

Isso, além de muita sorte, é tudo.

Pelo que entendi, você precisa saber como definir um valor para o registro durante o tempo de execução.Espero que os códigos abaixo possam ajudá-lo.

usando 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;
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top