dimanche 30 juin 2013

Télécharger Windows 8.1 Preview gratuitement

Télécharger Windows 8.1 Preview gratuitement


Il y a trois jours, Microsoft a lancé une nouvelle version de Windows 8, soit Windows 8.1 Preview. Cette version développée pour les développeurs contient essentiellement des améliorations à la suite de nombreux commentaires de la version Windows 8 originale. L’une des particularités les plus marquantes est le retour du bouton démarrer. Enfin !
Si vous désirez essayer cette nouvelle version de Windows 8.1 Preview, sachez que vous pouvez le télécharger gratuitement. Attention, cette version ne possède pas de désinstallation ni de restauration. Gardez en esprit que c’est une version BETA et que la version commerciale sera disponible qu’en fin 2013. Aussi, aucune mise-à-jour de la version 8.1 Preview vers la version régulière 8.1 n’est prévue par le géant Microsoft.



Acheter d’Amazon la mise-à-jour de Windows 8:

vendredi 28 juin 2013

Télécharger le nouveau Windows 8.1 Preview

Télécharger le nouveau Windows 8.1 Preview


Bonjour à tous, je suis actuellement en train de télécharger la nouvelle version de Microsoft Windows 8.1 Preview. Je vais tester la version anglaise en premier lieu et ensuite évaluer la version française. Si j’ai du temps, je testerai les versions allemande et espagnole avec le Language Pack.
À bientôt.

Windows 8.1 Preview sur MSDN

 Soyez les premiers l'essayer!

vendredi 14 juin 2013

Comment utiliser le clavier pour la reconnaissance vocale de Google

Comment utiliser le clavier pour la reconnaissance vocale de Google

Avec Google Chrome seulement, à partir d’une page de recherché Google, effectuer la recherché avec la reconnaissance vocale avec le clavier. Donc plus besoin de prendre votre souris et d’enfoncer le minuscule bouton situé complètement à droite du TEXTBOX. Appuyer et maintenir enfoncer CTRL+SHIFT+ “point” et commencer à parler en anglais si vous êtes sur GOOGLE.COM

Si vous désirez parler en français, sachez que ça fonctionne. Aller sur GOOGLE.FR
La reconnaissance vocale a besoin de pratique et doit aussi s’adapter aux différentes régions ou dialectes. J’imagine qu’à force de l’utiliser, le produit deviendra meilleur avec le temps. J’ai testé l’allemand et le chinois. J’ai perdu mon temps pour vous, car la machine n’est pas assez futée pour reconnaitre un seul mot de ce que j’ai dit.
Si vous êtes comme moi qui fonctionne avec plus d’une langue, sachez que vous pouvez paramétrer la langue par défaut en suivant les étapes suivantes :


Aller dans  Search Settings -> Languages ->
Ou si vous l’avez dans une autre langue: Paramètres de recherches -> Langues

Assurez-vous que vous avez autorisé le logiciel à accéder à votre microphone.

mardi 4 juin 2013

Recherche Registre en VB.NET

Recherche Registre en VB.NET

Comment tout savoir ce qu'il faut savoir dans l'utilisation des registres de Windows en programmation (VB.NET)? Cette page contient un programme exemple pour lire et rechercher des valeurs dans les clefs de registre dans Windows. Cet exemple codé avec Visual Studio comporte le code source complet avec des explications sur les principaux sujets ainsi que les difficultés les plus habituelles rencontrées par les programmeurs ou les utilisateurs.
On m'avait dernièrement posé la question à savoir si j'étais capable de faire XYZ opérations dans les registres. J'ai évidemment répondu que oui sans lui mentionner les multiples choses à penser pour produire un produit de qualité.

Qu'est-ce qu'une clef de registre?

Une réponse simple à la question serait que ce sont des données hiérarchisées et disponibles en utilisant le programme REGEDIT. Les données situées les registres sont utiles au fonctionnement de plusieurs programmes et le bon fonctionnement de Windows. Les données sont organisées  principalement avec les clefs suivantes :
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG

Deux des principales difficultés à l'utilisation de ces registres sont les problèmes de lecture et d'écritures causées par les ennuis de droits ou de permissions. Aussi, un gros problème pour les programmeurs informatiques est l'accessibilité des registres sous HKEY_LOCAL_MACHINE \SOFTWARE ou HKEY_CURRENT_USER \SOFTWARE lorsque vient le temps de fonctionner avec des programmes fonctionnant en 32 bits ou 64 bits. La difficulté devient ainsi multipliée par deux lorsque le système d'exploitation Windows est en mode 32 bits ou en mode 64 bits. En effet, si un programmeur développe un programme peut obtenir des données erronées s'il accède aux registres. Cela se produit typiquement aux programmeurs qui ne sont pas capables de travailler avec les technologies en 32 bits et simultanément en 64 bits.
Mais passons aux choses sérieuses, je vais tenter de décortiquer quelques thèmes quant à lecture de registre dans cet article et je vais fournir gratuitement un petit programme exemple avec son code source gratuitement. Je suis désolé si je ne peux pas discuter de tous les thèmes parce qu'autrement, j'écrierai un roman.

32 bits ou 64 bits


Il est très important de comprendre qu'il existe 2 types d'architecture disponible pour les processeurs en circulation : les processeurs en 32 bits et les processeurs en 64 bits.  La notion de multicœurs n'est pas importante dans le cas des registres parce que les processeurs multicœurs existent dans les 2 formats.
Voici une liste non exhaustive de processeurs disponibles en magasin à l'heure actuelle fonctionnant avec des processeurs 32 bits et 64 bits respectivement :
Processeurs à instruction à 32 bits :
Intel® Atom™ Processor
Intel Core 2 (1st generation)
Intel Pentium 4
Virtual Computer

Processeurs à instruction à 64 bits :
INTEL CORE i7-3630QM
AMD FX-8150
AMD E2-1800
INTEL CORE i5-3210M
Le principal problème est que même si les processeurs à architecture de 64 bits étaient disponibles au grand marché depuis 1999 avec les produits AMD tel que le AMD ATHLON 64 (1999) ou le ATHLON 64 X2 (DUAL-CORE 64 bits 2005), les grands génies en software n'ont pas suivi avec le hardware. Pensons un instant à Intel qui a commercialisé les premiers processeurs multi-cœurs, très peu de logiciels étaient capables de fonctionner en multicœur.
Conséquemment, les systèmes d'exploitations 64 bits de Microsoft n'étaient pas accessibles jusqu'en 2008 avec l'apparition de Windows 7 Release Candidate (RC). Les autres versions avant Windows 7 RC sont marginales et compliquent la vie des éditeurs de logiciels. Je parle de Windows XP 64, Windows Vista x64 et Windows Server 2008 x64.

Étant donné que le marché a été très lent à s'adapter au 64 bits et que beaucoup de logiciel se reposent sur les registres pour fonctionner, Microsoft a décidé de fabriquer et de dupliquer l'ensemble de ses librairies et de ses registres pour accommoder tout le monde. Après, nous nous demandons pourquoi Windows ne cesse de devenir de plus en plus gros (sic !).

Software vs Wow6432Node

Il n'est pas facile de se retrouver dans le fonctionnement des registres entre le système d'exploitation et les logiciels. Les logiciels peuvent être compilés en 32 ou 64 et il en est de même pour les systèmes d'exploitation qui les reçoivent. Pour m'aider à comprendre et à me souvenir du fonctionnement de registre entre logiciels et systèmes d'exploitation, je garde la formule suivante :
Tu choisis le bon logiciel à installer selon le Windows.

Autrement dit, si ton Windows est en 32, tu installes des logiciels en 32. Si au contraire ton Windows est en 64, tu installes du 64. Pardonnez-moi si ce n'est pas clair.
Si par contre, tu installes un logiciel en 32 sur un ordinateur en 64, alors le logiciel est en  retard sur la norme.  Microsoft a créé un répertoire spécial pour les logiciels retardés qui  fonctionnent en 32 sur les systèmes d'exploitation en 64. Ainsi lors de l'installation d'un logiciel retardé, Windows le détecte et place tous les registres retardés dans le Wow6432Node (pour Windows On Windows 64 to 32 NODE, en français : Nœud Windows à  Windows 64 vers 32).
En pratique cela se traduit par les exemples suivants :

Si votre système d'exploitation est un 32 bits, alors par exemple votre HKEY_LOCAL_MACHINE \SOFTWARE contiendra vos registres pour les logiciels 32 bits.

Si votre système d'exploitation est un 64 bits, alors par exemple votre HKEY_LOCAL_MACHINE \SOFTWARE contiendra vos registres pour les logiciels 64 bits et les HKEY_LOCAL_MACHINE \SOFTWARE\Wow6432Node contiendront les registres pour les logiciels en 32 bits.

Donc, si vous installez un vieux logiciel des années Windows XP en 32 bits sur un Windows 7 en 64 bits, il y a de grandes chances que les registres de ce vieux logiciel se retrouvent dans HKEY_LOCAL_MACHINE \SOFTWARE\Wow6432Node automatiquement. En effet, Windows 7 x64 va automatiquement rediriger les demandes d'écriture de registre à cet endroit.

Par contre, il faut faire très attention lorsque vous êtes un jeune programmeur ou si vous décider de programmer sans vous soucier entre les versions 32 et 64 bits. Lorsque vous décidez de lire ou d'écrire des clefs de registres, éviter à tout prix d'utiliser des noms de sous clé absolus avec l'utilisation du mot clef Wow6432Node. Vous allez sérieusement limiter le fonctionnement de votre programme lorsque vous tenteriez d'installer votre programme sur un ordinateur différent. L'idéal, si vous êtes nulle en programmation ou bien si vous ne voulez pas trop faire d'effort pour créer un programme accessible pour tout le monde, alors programmer et compiler des logiciels ou librairies en 32 bits. Microsoft a pensé aux gens comme vous depuis les années 2000 qui ne sont pas capables de faire de saut en 64 bits. Un programme en 64 bits ne fonctionnement tout simplement pas sur un ordinateur 32 bits.

J'ai produit un exemple de programme qui permet d'explorer les registres semblables a ce que REGEDIT peut faire, c'est-à-dire avec l'utilisation d'une arborescence. Vous constaterez que j'ai ajouté 2 choix de présentations des registres Windows: une version 32 bits et une autre en 64 bits. En regardant le code source que j'ai inclus dans ce chapitre, vous constateriez que la clef Wow6432Node utilisée comme exemple n'est pas une clef appartenant à SOFTWARE mais bien à HKEY_LOCAL_MACHINE. Autrement dit, les registres ne sont pas organisés de la même façon pour un logiciel versus l'explorateur dans REGEDIT.
La partie de code dans mon programme pertinent à ce chapitre est le suivant :

            If rb32BitsView.Checked Then
                oBaseKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, tbComputerName.Text, RegistryView.Registry32)
            Else
                oBaseKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, tbComputerName.Text, RegistryView.Registry64)
            End If


Selon le code présenté, vous comprenez que la méthode pour accéder aux registres est exactement la même. Il suffit de préciser laquelle des versions des registres désirons-nous travailler. Pour effectuer une bonne pratique, tout programmeur-analyste qui sollicite l'utilisation des registres Windows doit impérativement se soucier du type de registres auxquelles ils doivent travailler.

GetSubKey  et GetValues

Les registres fonctionnement semblablement aux fichiers et répertoires Windows à la différence que les registres contiennent de petits fichiers de données et que l'autre peut contenir de fichiers plus volumineux par exemple des fichiers vidéo ou de photos. Les registres sont donc composés de clefs et de valeur équivalente à des répertoires et de fichiers.
Donc, pour être capable de lire les données dans les registres, il faudra utiliser la méthode GetSubKey et GetValues pour justement accéder aux sous-clefs et valeurs contenus dans une clef.


        Dim sGetSubKeyNames() As String ' 1st level of Key
        Dim oRegistryKey As RegistryKey
        Try

    '[ . . .]
            sGetSubKeyNames = oRegistryKey.GetSubKeyNames()
    '[ . . .]



En DOT NET, la méthode retourne un tableau de chaîne de caractères contenant les noms de clefs sous une clef de registre. Le tableau est vide lorsqu'il n'existe aucun résultat.  Vous obtenez un code d'erreur lorsque vous tentez d'accéder à un registre avec des autorisations restreintes. Par exemple,  si vous appelez la méthode GetSubKey sur HKEY_LOCAL_MACHINE\SECURITY

La lecture de registres fonctionne de la même façon que pour l'écriture. D'où la raison que je n'ai pas créé une section sur le sujet.

Explorateur de Registres


Le programme REGEDIT de Microsoft est un excellent outil pour explorer dans les registres. On peut même accéder aux ordinateurs à distance, exporter des registres, importer de registres, lire les permissions des clefs de registres, modifier des permissions dans les registres, et cetera.
J'ai produit un programme et le code source est disponible à la fin de cet article. Le programme permet à partir de sa première fenêtre d'accéder aux registres à travers une arborescence de type TREEVIEW en 32 bits ou en 64 bits.  Le fonctionnement de nœud est relativement simple et efficace. Il s'agit à partir d'un nœud de lire tous les sous-clefs et de les insérer dans le Nœud courant de la TREEVIEW. Ensuite, pour des raisons de présentation, le programme détermine la présence de sous-clef dans chacun des sous-clefs du nœud de départ produisant ainsi des petits PLUS à côté de nœud de l'arborescence. Voici un extrait du code qui permet d'effectuer cette manœuvre.


  Private Sub LoadRegistry(ByRef oTreeNode As TreeNode, ByRef oRegistryKey As RegistryKey)

        Dim index1 As Integer
        Dim index2 As Integer
        Dim index3 As Integer
        Dim sGetSubKeyNames() As String ' 1st level of Key
        Dim sGetSubKeyNames2() As String '  ' 2nd level of Key
        Dim oRegistryKey2 As RegistryKey
        Dim tempNode As TreeNode
        Dim tempNode2 As TreeNode
        Dim found As Boolean
        Dim found2 As Boolean
        Try 'this is important because you might not be able to access registry
            'Exemple : HKEY_LOCAL_MACHINE\SECURITY
            sGetSubKeyNames = oRegistryKey.GetSubKeyNames()

            For index1 = 0 To sGetSubKeyNames.Length - 1 Step 1
                'unfortunally i don't have a AddRange from String Array to TreeNode Array :-( tooooo bad
                Try
                    tempNode = New TreeNode(sGetSubKeyNames(index1))
                    found = False
                    For Each fNode As TreeNode In oTreeNode.Nodes
                        If fNode.Text = sGetSubKeyNames(index1) Then
                            found = True
                            Exit For
                        End If
                    Next
                    If found = False Then
                        oTreeNode.Nodes.Add(tempNode)
                    End If
                Catch ex As Exception

                End Try

            Next


            'seulement préchercher les directory immédiats suivantes
            'This will only look the next level of Keys , creating plus signs next to the Nodes.
            For index1 = 0 To sGetSubKeyNames.Length - 1 Step 1

                Try
                    oRegistryKey2 = oRegistryKey.OpenSubKey(sGetSubKeyNames(index1))
                    sGetSubKeyNames2 = oRegistryKey2.GetSubKeyNames()
                    For index2 = 0 To sGetSubKeyNames2.Length - 1 Step 1
                        'unfortunally i don't have a AddRange from String Array to TreeNode Array :-( tooooo bad
                        tempNode2 = New TreeNode(sGetSubKeyNames2(index2))
                        found2 = False
                        For Each fNode As TreeNode In oTreeNode.Nodes(index1).Nodes
                            If fNode.Text = sGetSubKeyNames2(index2) Then
                                found2 = True
                                Exit For
                            End If
                        Next
                        If found2 = False Then
                            oTreeNode.Nodes(index1).Nodes.Add(tempNode2)
                        End If

                        'If Not oTreeNode.Nodes(index1).Nodes.Contains(tempNode2) Then
                        'the basic Contains methods inside the node is not reliable
                        '    oTreeNode.Nodes(index1).Nodes.Add(tempNode2)
                        'End If
                    Next
                Catch ex As Exception

                End Try

            Next
       Catch ex As Exception
            'MsgBox(ex.Message)
        End Try

    End Sub


Il est clair et certain que le code aurait pu être optimisé. Par exemple, il n'est pas nécessaire de collectionner tous les sous-clés en dessous d'une sous-clé  si c'est simplement pour savoir si un PLUS doit exister ou non.  La lecture d'un premier élément suffit pour remplir cette condition. Mais j'ai préféré préserver le code ainsi comme exemple.

Youtube demo




Type de KeyValues

Il existe plusieurs types de valeur dans les clefs de registres. Si vous utilise en DOT NET la méthode TOSTRING pour convertir une valeur en un format lisible, vous pourriez obtenir un message d'erreur si le format n'est pas une chaine de caractère ou un nombre normal.  C'est dans le cas d'une valeur en binaire. Ça ne vous donnera pas une belle série de zéros ou de uns. Donc, vous devez vérifier le type de valeur avant de la traiter.

Notez qu'en général, la notion de nombre en décimal ou en hexadécimal n'a pas trop d'importance puisqu'un nombre reste un nombre.

Voici une partie de code disponible dans l'exemple téléchargeable où je traite la valeur selon le type. J'admets que c'est assez idiot comme exemple, mais dans la vie pourquoi faire compliqué lorsqu'on peut faire simple ? Vous connaissez le KISS ? Keep It Simple and Stupid !



If oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.DWord Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.ExpandString Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.MultiString Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.QWord Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.String Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.Binary Then
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.Unknown Then
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.None Then
                            End If




Recherche de valeur KeyValue


Si je désire retrouver une certaine valeur dans les registres et si je n'ai pas indexé les résultats, alors je dois évidemment naviguer à travers l'ensemble ou une sous-clefs de mes registres.  Pour éviter de développer un code informatique avec trop de lignes de codes et qui figerait mon programme durant la recherche de ma valeur, j'ai décidé de construire un THREAD indépendant de mon programme principal et de la faire fonctionner en arrière-plan (BACKGROUND). Ensuite, par principe de lisibilité de code, la fonction en arrière-plan sera récursive. Le degré de difficulté de ce type de fonction est légèrement plus difficile parce qu'elle diffère légèrement d'une récursivité normale à cause des arguments pour le THREAD.

Fonction récursive et THREAD de base


Voici la fonction SEARCH2 incluant la structure myArguments en argument pour le fonctionnement de la fonction appelée récursivement en BACKGROUND. Cette fonction d'être relativement court et relativement efficace pour rechercher dans les registres. Si jamais une recherche respecte les critères la casse et le mot entier, alors la fonction injecte le résultat dans un tableau de type DATAGRIDVIEW. L'animation du formulaire est assurée par l'emploi d'une fonction INVOKE qui affiche le nom du registre courant.


    Structure myArguments
        Public rPath As String
        Public sStringSearch As String
        Public BaseRegistryKey As RegistryKey
        Public View As Microsoft.Win32.RegistryView
        Public MatchCase As Boolean
        Public MatchWholeWord As Boolean
    End Structure


    Private Sub Search2(ByVal oArgs As myArguments)

        Dim oRegistryKey As RegistryKey
        Dim sGetValueNames() As String
        Dim sGetSubKeyNames() As String ' 1st level of Key
        Dim index1 As Integer
        Dim index2 As Integer
        Dim str(DataGridView1.ColumnCount - 1) As String
        Dim add_result As Boolean
        Try
          
            oRegistryKey = oArgs.BaseRegistryKey '.OpenSubKey(oArgs.rPath)

            If oRegistryKey IsNot Nothing Then
                Try
                    UpdateGroupBox2(oRegistryKey.Name)
                    sGetValueNames = oRegistryKey.GetValueNames()
                    For index1 = 0 To sGetValueNames.Length - 1 Step 1

                        ''test add or not

                        add_result = False
                        If oArgs.MatchWholeWord = True Then
                            If sGetValueNames(index1) IsNot Nothing And oArgs.sStringSearch IsNot Nothing Then
                                If sGetValueNames(index1).Length = oArgs.sStringSearch.Length Then
                                    If oArgs.MatchCase = True Then
                                        If InStr(sGetValueNames(index1), oArgs.sStringSearch, CompareMethod.Binary) > 0 Then
                                            '
                                           add_result = True
                                        End If
                                    Else
                                        If InStr(UCase(sGetValueNames(index1)), UCase(oArgs.sStringSearch), CompareMethod.Binary) > 0 Then
                                            add_result = True
                                        End If
                                    End If
                                End If
                            End If
                        Else

                            If oArgs.MatchCase = True Then
                                If InStr(sGetValueNames(index1), oArgs.sStringSearch, CompareMethod.Binary) > 0 Then
                                    add_result = True
                                End If
                            Else
                                If InStr(UCase(sGetValueNames(index1)), UCase(oArgs.sStringSearch), CompareMethod.Binary) > 0 Then
                                    add_result = True
                                End If
                            End If
                        End If


                        If add_result = True Then
                            'MSgBox(sGetValueNames(index1))
                            If oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.DWord Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.ExpandString Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.MultiString Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.QWord Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.String Then
                                str(cValue.Index) = oRegistryKey.GetValue(sGetValueNames(index1)).ToString
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.Binary Then
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.Unknown Then
                            ElseIf oRegistryKey.GetValueKind(sGetValueNames(index1)) = RegistryValueKind.None Then
                            End If
                            str(cComputer.Index) = _ComputerName
                            str(cKeyName.Index) = sGetValueNames(index1)
                            str(cRegistryPath.Index) = oRegistryKey.Name
                           
                            Me.Invoke(New MethodInvoker(Sub() DataGridView1.Rows.Add(str)))
                        Else
                        End If
                    Next
                Catch ex As Exception
                    'MsgBox(ex.StackTrace)
                End Try
                Try
                    sGetSubKeyNames = oRegistryKey.GetSubKeyNames()
                    For index2 = 0 To sGetSubKeyNames.Length - 1 Step 1
                        'La fonction récursive
                        Try
                            oArgs.rPath = oArgs.rPath & "\" & sGetSubKeyNames(index2)
                          
                            oArgs.BaseRegistryKey = oRegistryKey.OpenSubKey(sGetSubKeyNames(index2))
                            Search2(oArgs)
                        Catch ex As Exception

                        End Try

                    Next
                Catch ex As Exception
                    'MsgBox(ex.StackTrace)
                End Try
            End If


        Catch ex As Exception
            'MsgBox(ex.StackTrace)
        End Try

    End Sub


Création d'une clef de registre

Je n'ai inclus de fonction de création de registres dans l'exemple utilisé dans cet article. Règle générale, le principe d'écriture de registre est similaire à la lecture des registres avec l'utilisation de SETVALUE et de CREATESUBKEY.

Conclusion, Téléchargement et Visual Studio


J'utilise Microsoft Visual Studio 2010 pour faire tous mes projets. Je vous suggère d'acheter et d'obtenir le meilleur IDE dans le monde et le plus récent: Microsoft Visual Studio 2012 sur Amazon .
et
télécharger le projet utilisé en exemple: RegistryRecursiveSearchSample.zip
Voici d'autres sujets d'article qui pourraient vous intéresser: