Skip to content
 

Installation silencieuse de Notepad++ et remplacement du Bloc-notes de Windows

Introduction

Voilà t’y pas que, depuis quelques mois, je me suis plongé dans les entrailles de Windows Seven. La lourde tâche que je me suis fixé est de construire une routine d’installation intégrant paramètres qui vont bien et logiciels idoines afin de m’économiser quelques sueurs lors des futurs déploiements de la bête.
Forcément est venu un moment où je me suis penché sur l’installation de Notepad++ et sur le foutu défi qui lui colle aux basques depuis sa création lequel consiste à faire accepter à Windows le remplacement de son rustique Bloc-notes par cet élégant couteau suisse de l’édition de texte. Les solutions proposées sur le site de monsieur Notepad++ ne m’ont pas franchement satisfait. Du coup, j’ai repris à ma façon la brillante idée développée ici par un dénommé Selyb qui se base sur une modification de la base de registre façon hack de bonne cuvée.

La ruse repose sur cette clé :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

Il faut en effet savoir qu’en préalable à tout lancement, les programmes vont jeter là un œil attentif des fois qu’ils y trouveraient des instructions particulières à se mettre sous la dent avant que de partir bosser. Ainsi donc, pour peu qu’on y crée une clé dénommée comme ça au hasard Notepad.exe et qu’on lui rajoute une valeur chaîne Debugger ayant pour donnée C:\Windows\System32\calc.exe, on s’esbaudira de voir apparaître la calculatrice en lieu et place du bloc-notes à chaque fois qu’on tentera d’ouvrir un fichier texte ou de lancer directement ce foutu bloc-notes.

Quel intérêt, me direz vous? En l’occurrence, aucun : je vous l’accorde, faut être un peu nouille pour vouloir obtinément substituer la calculatrice au bloc-notes. Mais bon, laissons nous aller à rêvasser un instant et imaginons qu’à la place de calc.exe on glisse en douce un petit script vbs de rien du tout. Par construction, le script en question va porter en paramètres le chemin de l’éventuel fichier texte lancé. Ne reste plus alors qu’à lui adjoindre quelques lignes judicieusement choisies pour qu’il demande poliment à Notepad++ d’ouvrir derechef et sans plus discutailler ledit fichier texte. Et hop, on a pile-poil ce qu’on recherchait…

J’ai expérimenté la chose sans souci durant quelques semaines jusqu’à ce qu’un jour, je tombe sur un bête fichier texte qui refusa obstinément de s’ouvrir. À force d’écarquiller mes yeux fatigués, je finis par découvrir que deux espaces contigus s’étaient malicieusement glissés dans son nom. Or, les espaces font office de séparateur d’arguments en ligne de commande.

Ainsi lorsque je lançais le fichier C:\Nouveau document texte.txt, le script chargé de l’ouvrir dans Notepadd++ disposait de trois arguments C:\Nouveau, document et texte.txt. Avec ça, il reconstruisait le chemin du fichier en concaténant les trois arguments séparés chacun par un espace.

Le problème est qu’avec cette méthode, demander l’ouverture du fichier C:\Nouveau     document     texte.txt avec un tas d’espaces est interprété par le script comme l’ordre de lancer un fichier C:\Nouveau document texte.txt, lequel, même s’il existe, n’est pas du tout celui qu’on attend.

Le fait est qu’après avoir tourné le problème dans tous les sens, il a bien fallu que je me rende à l’évidence : le vbscript n’est pas la solution.

C’est comment qu’on fait?

Il m’est alors revenu une particularité fort intéressante des fichiers hta. Ils disposent en effet d’une propriété commandLine qui, comme son nom l’indique, récupère l’intégralité de la ligne de commande qui a initié leur lancement.
Essayage aussi sec de la chose et voici ce que renvoie commandLine quand on lance un fichier C:\Nouveau document texte.txt :

"C:\ProgramFiles\Notepad++\npp.hta" "C:\Windows\system32\NOTEPAD.EXE" C:\Nouveau document texte.txt

Curieusement, avec un fichier C:\Nouveau document registre.reg, on observe la réduction en minuscule de notepad.exe et l’apparition de guillemets autour du chemin du fichier reg :

"C:\ProgramFiles\Notepad++\npp.hta" "C:\Windows\system32\notepad.exe" "C:\Nouveau document registre.reg"

Quoi qu’il en soit, on dispose bel et bien du chemin complet du fichier à lancer, et ce quel que soit le nombre d’espaces contigus qu’il contient.

Ne reste plus qu’à faire bouillir quelques neurones pour en arriver à un truc qui ressemblerait à ça :

<html>
<head>
<HTA:APPLICATION 
	ID="NotepadHTA"
	APPLICATIONNAME="NotepadHTA"
	SINGLEINSTANCE="yes"
	CAPTION="No"
	CONTEXTMENU="No"
	MAXIMIZEBUTTON="No"
	MINIMIZEBUTTON="No"
	SYSMENU="No"
	BORDER="none"
	INNERBORDER="No"
	SCROLL="No"
	WINDOWSTATE="Minimize">
</head>

<SCRIPT Language="VBScript">

'On réduit la fenêtre à 0
Me.ResizeTo 0,0

Set objShell = CreateObject("Wscript.Shell")
Set objSysEnv = objShell.Environment("SYSTEM")
Set objFSO = CreateObject("Scripting.FileSystemObject")


'Récupération du chemin de l'exécutable de Notepad++ en fonction du système.
'Dans la foulée, on récupère également le chemin de ActiverFenetreNotepad++.exe.
'ActiverFenetreNotepad++.exe est un script AutoIt qui se charge
'd'activer la fenêtre de Notepad++ à son ouverture
'pour la passer au premier plan
If objSysEnv("PROCESSOR_ARCHITECTURE") = "AMD64" Then
	'64 bits
	strCheminNotepad = objShell.ExpandEnvironmentStrings("%PROGRAMFILES(X86)%") & "\Notepad++\Notepad++.exe"
	strCheminActiver = objShell.ExpandEnvironmentStrings("%PROGRAMFILES(X86)%") & "\Notepad++\ActiverFenetreNotepad++.exe"
Else
	'32 bits
	strCheminNotepad = objShell.ExpandEnvironmentStrings("%PROGRAMFILES%") & "\Notepad++\Notepad++.exe"
	strCheminActiver = objShell.ExpandEnvironmentStrings("%PROGRAMFILES%") & "\Notepad++\ActiverFenetreNotepad++.exe"
End If

Sub Window_onLoad
	'On récupère la ligne de commande en enlevant les éventuels espaces résiduels en bout de chaine
	strLigneCommande = Trim(NotepadHTA.commandLine)
	'On passe en minuscule pour lever toute ambiguïté
	strLigneCommande = LCase(strLigneCommande)
	'On récupère la position de "\system32\notepad.exe""
	position = InStrRev(strLigneCommande, "\system32\notepad.exe" & chr(34))
	'On rajoute le nombre de caractères compris dans "\system32\notepad.exe"", soit 21
	position = position + 21
	If position < len(strLigneCommande) Then
		'S'il y a du texte après, il contient le chemin du fichier lancé qu'on s'empresse de récupérer
		strCheminFichier = Right(strLigneCommande, len(strLigneCommande) - position)
		'On enlève les guillemets éventuels
		strCheminFichier = Replace(strCheminFichier, chr(34), "")
		'On enléve les éventuels espaces résiduels en bout de chaine
		strCheminFichier = Trim(strCheminFichier)
		'et on l'ouvre avec Notepad++
		objShell.Run Chr(34) & strCheminNotepad & Chr(34) & " " & chr(34) & strCheminFichier & Chr(34), 1, False
	Else
		'Si l'utilisateur a lancé le Bloc-Note de Windows, on ouvre simplement Notepad++
		objShell.Run Chr(34) & strCheminNotepad & Chr(34), 1, False
	End If
	'Lancement de ActiverFenetreNotepad++.exe pour passer Notepad++ au premier plan
	If objFSO.FileExists(strCheminActiver) Then
		objShell.Run Chr(34) & strCheminActiver & Chr(34), 0, False
	End If
	'On quitte avec la conscience du travail bien fait
	Me.Close()
End Sub

</SCRIPT>
<body>
</body>
</html>

 
Il vous revient de copier le texte du script dans votre éditeur favori, d’enregistrer la chose dans le dossier Notepad++ planqué dans Program Files (ou Program Files (x86) si vous êtes en 64 bits) sous le doux nom de npp.hta.
Par ailleurs, vous pouvez, si vous le souhaitez (et notez que ce n’est pas impératif, vous faites comme bon vous semble!), télécharger ActiverFenetreNotepad++.exe pour le glisser aux cotés de npp.hta.

Et que voilà les modifications de registre à opérer sur une machine en 32 bits :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]
"C:\Windows\System32\mshta.exe" "C:\Program Files\Notepad++\npp.hta"

 
Et pour un système en 64 bits :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]
"C:\Windows\System32\mshta.exe" "C:\Program Files (x86)\Notepad++\npp.hta"

 
Là encore, ouvrez le bloc-notes de votre choix, copiez-y celui des textes ci-dessus qui correspond à votre système et enregistrez-le où et comme bon vous semble mais impérativement avec une extension reg. Vous lancez ensuite le fichier résultant pour le fusionner avec la base de registre. Et pis c’est fini!
Si vous avez la flemme, vous pouvez tout aussi bien télécharger directement le script npp.hta et le fichier registre de votre choix Notepad32.reg ou Notepad64.reg.

Et si vous avez la ferme intention de n’endommager en rien le poil que vous cultivez amoureusement au creux de la main, je vous engage à laisser doucement glisser un œil (oui, un seul devrait suffire) sur la suite.

La Totale!

Evidemment, comme mon but initial était et reste une automatisation globale, il a bien fallu que je me coltine un fichier d’installation pour gérer tout ce petit monde. Au final, voilà ce qu’effectue la petite bête par mes soins accouchée et que j’ai baptisée InstallNotepadIntegration.vbs :

  • Récupérations des divers chemins.
  • Si le dossier Notepad++ n’est pas trouvé dans Program Files, on quitte en présentant nos plus plates excuses.
  • S’il est trouvé :
    • On y copie les fichiers :
      • npp.hta,
      • RemplacementBlocNoteParNotepad.vbs
      • AnnulationRemplacementBlocNoteParNotepad.vbs,
      • ActiverFenetreNotepad++.exe.
    • On ajoute une entrée notepad.exe à la clé de registre Image File Execution Options évoquée plus haut.
    • Dans cette clé, on insère une valeur chaîne Debugger ayant pour donnée : "C:\Windows\System32\mshta.exe" "C:\Program Files\Notepad++\npp.hta" si on est en 32 bits ou "C:\Windows\System32\mshta.exe" "C:\Program Files (x86)\Notepad++\npp.hta" si on est en 64 bits.
    • On supprime les entrées Edit with Notepad++ dans le menu contextuel. Elles n’ont en effet plus lieu d’être puisque Notepad++ est devenu de fait l’éditeur par défaut. Pour réaliser la chose, on recherche dans le dossier de Notepad++ un fichier dll dont le nom ressemble à NppShell_XY.dll, les chiffres X et Y variant au gré des versions de Notepad++. Aussitôt qu’on l’a trouvée, on désenregistre la dll.
    • En revanche, on tripote la base de registre afin d’ajouter une entrée Ouvrir avec Notepad++ dans le menu contextuel des fichiers d’extension inconnue.
    • On glisse un raccourci Rétablir le Bloc-notes de Windows dans le dossier Notepad++ du menu Démarrer. Ce raccourci pointe vers le fichier AnnulationRemplacementBlocNoteParNotepad.vbs précédemment copié.
    • On quitte.

 
Vous aurez bien évidemment deviné que le fichier AnnulationRemplacementBlocNoteParNotepad.vbs assure l’annulation de toutes les modifications apportées à la base de registre. Par ailleurs, il remplace le raccourci Rétablir le Bloc-notes de Windows par un autre dénommé Remplacer le Bloc-notes de Windows par Notepad++ qui, ô surprise, pointe vers le fichier RemplacementBlocNoteParNotepad.vbs dont je ne vous ferai pas l’injure de détailler les fonctions.

Conclusion et téléchargements

Pour rendre l’ensemble compatible avec ma procédure d’installation silencieuse de programmes sous windows 7, ne manquent plus qu’un fichier Description.txt dont le contenu vaut simplement :

Installation de Notepad++ 5.9.

 
et un fichier Install.vbs qui aura la lourde tâche de procéder à l’installation silencieuse de Notepad++ et au lancement d’InstallNotepadIntegration.vbs. Il se résume aux quelques lignes qui suivent :

Set objShell = CreateObject("Wscript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

'Récupération du chemin du dossier du script
strCheminDossier = objFSO.GetParentFolderName(Wscript.ScriptFullName)

'Lancement de l'installation de Notepad++ en mode silencieux
strCheminFichier = strCheminDossier & "\Notepad++.exe"
objShell.Run Chr(34) & strCheminFichier & Chr(34) & " /S", 0, True

'Remplacement du Bloc-notes de Windows par Notepad++
strCheminFichier = strCheminDossier & "\InstallNotepadIntegration.vbs"
objShell.Run Chr(34) & strCheminFichier & Chr(34), 0, True

 
Comme à l’accoutumée, je vous livre ici l’ensemble de la chose allégée de l’installateur de Notepad++ que vous pouvez télécharger en prenant bien soin de le renommer en Notepad++.exe.

Notez bien que si vous disposez déjà sur votre machine de Notepad++, vous pouvez procéder au remplacement du Bloc-notes de Windows en lançant InstallNotepadIntegration.vbs.
 
 

Page vue 6 271 fois

3 commentaires

  1. DarkWizzard dit :

    Et la je dis chapeau, voici la technique qui est la plus simple à mon gout ! Chapeau bas !

  2. Gilles dit :

    Bonjour,

    Super bien comme idée ! le hta !

    Sauf que (parce qu’il y a un sauf que…)
    J’ai téléchargé le dossier notepad++.rar
    Je l’ai décompressé, j’ai exécuté InstallNotepadIntegration.vbs
    Et là : Boite de dialogue avec bouton rouge et croix blanche : Erreur Windows Script Host :
    Script : G:\Notepad++\InstallNotepadIntegration.vbs
    Ligne : 91
    Caract. :2
    Erreur Chemin d’accès introuvable
    Code : 800A004C
    Source : Erreur d’exécution Microsoft VBScript

    Je précise que l’installation est opérationnelle puique Notepad++ est désormais mon éditeur par défaut

    Une erreur du même genre apparait à l’exécution de AnnulationRemplacementBlocNotesParNotepad.vbs
    Script : G:\Notepad++\AnnulationRemplacementBlocNotesParNotepad.vbs
    Ligne : 48
    Caract. :1
    Erreur Chemin d’accès introuvable
    Code : 800A004C
    Source : Erreur d’exécution Microsoft VBScript

    Et le travail est quand même fait…

    Que dois-je en penser ?
    S’agit-il de ma config ? (Windows XP SP3 pas toute neuve)

  3. Laurent dit :

    Bonjour et merci pour ce retour…
    Il s’agit bel et bien de votre configuration.
    Sans doute ai-je fait l’erreur de ne pas souligner assez que cette procédure s’applique à Windows Seven.
    Elle déraille légèrement sous Windows XP pour la bonne et simple raison que le chemin du menu Démarrer n’est pas le même que sous Seven.
    Je pense sans pouvoir le vérifier qu’il suffit de modifier la ligne 27 du fichier InstallNotepadIntegration.vbs pour passer de

    strCheminDossierMenuDemarrer = objShell.SpecialFolders("AllUsersStartMenu") & "\Programs"

    à

    strCheminDossierMenuDemarrer = objShell.SpecialFolders("AllUsersStartMenu") & "\Programmes"

    Et de répéter l’opération dans le fichier AnnulationRemplacementBlocNotesParNotepad.vbs à la ligne 17.
    Sinon, une autre excellente solution quoique plus radicale serait de faire le grand saut vers Windows Seven.
    Cordialement,
    Laurent.

Laissez une réponse