Standard-Editor notepad ersetzen

    • Offizieller Beitrag

    Hi,
    kaum einer nutzt wohl den eher funktionslosen, windowseigenen Editor notepad. Zu viele schöne Alternativen gibt es da.

    Mit folgendem Programm könnt ihr jeden beliebigen Editor als Ersatz für Notepad festlegen. Alle internen Notepadaufrufe landen dann bei dem Editor eurer Wahl.
    Voraussetzung:
    Euer Editor ist eine EXE (jEdit fällt also aus) und ruft die Dateien in der Form "EDITOR.EXE %1" auf.

    Wie gehts?
    Es gibt die Launcher-Datei (notepad.au3), die als "notepad.exe" kompiliert werden muß. Sie ersetzt das Original und stellt den Kontakt zu eurem Editor her.

    Die zweite Datei (AlternateNotepad.au3) dient zur Installation, Deinstallation des Launchers und zum Einrichten oder Wechseln des Alternativen Editors.
    Dazu wird ein Reg-Schlüssel angelegt, der auf die Alternative verweist.
    Die Original Notepad-Datei wird gesichert.

    Kompiliert die Datei als "AlternateNotepad.EXE" und ruft sie wie folgt auf:
    "AlternateNotepad.EXE" Installiert Launcher, setzt Alternativen Editor
    "AlternateNotepad.EXE /e" Wechselt den Alternativen Editor
    "AlternateNotepad.EXE /b" Rollback - stellt Originalzustand wieder her

    Getestet habe ich es mit "Notepad++", "Notepad2" und "SciTE".

    EDIT:
    Eine Änderung am Launcher.
    Ich hatte nicht berücksichtigt, dass im Editorpfad Leerzeichen enthalten sein können. Ist jetzt gefixt.

    Launcher:

    Spoiler anzeigen
    [autoit]

    ; Launcher für alternativen Editor statt Notepad (ersetzt notepad.exe)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $FullEditorPath = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor', 'FullPath')
    Dim $Line = ''
    If $CmdLine[0] > 0 Then
    For $i = 1 To $CmdLine[0]
    If $i = 1 Then
    $Line &= $CmdLine[$i]
    Else
    $Line &= ' ' & $CmdLine[$i]
    EndIf
    Next
    Run( '"' & $FullEditorPath & '" "' & $Line & '"' )
    Else
    Run( '"' & $FullEditorPath & '"' )
    EndIf

    [/autoit]

    AlternateNotepad:

    Spoiler anzeigen
    [autoit]

    ; Installation/DeInstallation Launcher für Notepad Ersatz

    [/autoit] [autoit][/autoit] [autoit]

    Global $arDest[4] = [ _
    @WindowsDir & '\servicepackfiles\i386\', _
    @WindowsDir & '\system32\dllcache\', _
    @WindowsDir & '\system32\', _
    @WindowsDir & '\']
    Global $start = 0
    If Not FileExists(@WindowsDir & '\servicepackfiles\i386\notepad.exe') Then $start = 1

    If $CmdLine[0] > 0 Then
    Switch $CmdLine[1]
    Case "/b"
    _RollBack() ; Schalter '/b' für: RollBack (Originalzustand)
    Case "/e"
    _SetAlternate(False) ; Schalter '/e' für: nur neuer Editor
    EndSwitch
    Else
    _SetAlternate(True)
    EndIf

    Func _SetAlternate($FULL=True)
    Dim $alternateEditorPath = ''
    If $FULL Then
    Dim $source = ''
    Do
    $source = FileOpenDialog("Pfad der Launcher Datei auswählen", @ScriptDir, "(*.exe)")
    If $source = '' Then
    If MsgBox(262180, 'Keine Datei ausgewählt', 'Wollen Sie nochmals wählen?') = 7 Then Exit
    EndIf
    Until $source <> ''
    FileCopy(@WindowsDir & '\notepad.exe', @WindowsDir & '\notepad.exe.org') ; Sicherheitskopie Original
    Local $sourceFile = StringTrimLeft($source, StringInStr($source, '\', 1, -1))
    For $i = $start To UBound($arDest) -1
    If FileCopy($source, $arDest[$i] & $sourceFile, 1) = 0 Then
    MsgBox(262160, 'Kopierfehler', 'Die Launcher Datei konnte nicht in den Pfad:' & @LF & _
    $arDest[$i] & @LF & @LF & _
    'kopiert werden. Bitte das Programm mit dem "Rollback-Parameter /b" aufrufen.' )
    Exit
    EndIf
    Next
    EndIf
    Do
    $alternateEditorPath = FileOpenDialog("Pfad des alternativen Editors auswählen", @HomeDrive, "(*.exe)")
    If $alternateEditorPath = '' Then
    If MsgBox(262180, 'Keine Datei ausgewählt', 'Wollen Sie nochmals wählen?') = 7 Then Exit
    EndIf
    Until $alternateEditorPath <> ''
    If RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor', 'FullPath', "REG_SZ", $alternateEditorPath) = 0 Then
    MsgBox(262160, 'Registryfehler', 'Der Schlüssel:' & @LF & _
    'HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor, FullPath, REG_SZ, ' & $alternateEditorPath & @LF & _
    'konnte nicht in die Registry geschrieben werden.' & @LF & _
    'Bitte das Programm mit dem "Rollback-Parameter /b" aufrufen.' )
    Exit
    Else
    MsgBox(262208, 'Erfolg', 'Alle Einträge wurden erfolgreich ausgeführt.')
    EndIf
    EndFunc ;==>_SetAlternate

    [/autoit] [autoit][/autoit] [autoit]

    Func _RollBack()
    If Not FileExists(@WindowsDir & '\notepad.exe.org') Then
    MsgBox(262160, 'Dateifehler', 'Die Sicherung der Originaldatei:' & @LF & _
    @WindowsDir & '\notepad.exe.org' & @LF & _
    'ist nicht vorhanden!' & @LF & _
    'Eine Wiederherstellung ohne diese Datei ist nicht möglich!')
    Exit
    EndIf
    For $i = $start To UBound($arDest) -1
    If FileCopy(@WindowsDir & '\notepad.exe.org', $arDest[$i] & 'notepad.exe', 1) = 0 Then
    MsgBox(262160, 'Kopierfehler', 'Die Original Datei konnte nicht in den Pfad:' & @LF & _
    $arDest[$i] & @LF & _
    'kopiert werden.' & @LF & @LF & _
    'Bitte kopieren Sie die Original "notepad.exe" in GENAU dieser Reihenfolge' & @LF & _
    'in die folgenden Pfade:' & @LF & _
    @WindowsDir & '\servicepackfiles\i386\ (sofern vorhanden)' & @LF & _
    @WindowsDir & '\system32\dllcache\' & @LF & _
    @WindowsDir & '\system32\' & @LF & _
    @WindowsDir & '\')
    Exit
    EndIf
    Next
    RegDelete('HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor')
    MsgBox(262208, 'Erfolg', 'Der Original Windows-Editor "notepad"' & @LF & _
    'ist ab sofort wieder Standardeditor.')
    EndFunc ;==>_RollBack

    [/autoit]

    Edit2:

    Ich habe jetzt noch ein Variante mit GUI erstellt. Hierbei wird die Launcher-Datei mit in das Skript des Alternate Programms eingebunden.
    Dazu zuerst die Launcher-Datei (notepad.exe) kompilieren und den Quell-Pfad dieser Datei im Skript 'Alter_Notepad.au3' im Funktionsaufruf FileInstall() in Zeile 101 als String eintragen (FileInstall erfordert für die Quellangabe Stringform).
    Jetzt kann 'Alter_Notepad' kompiliert werden und auf jedem PC (Win2k, WinXP) eingesetzt werden.
    Ich habe festgestellt, dass Win2k Pro und WinXP Pro anstandslos das Kopieren der Launcherdatei tolerieren.
    WinXP Home bringt dort eine Sicherheitsabfrage. Aus diesem Grund habe ich nach dem Kopiervorgang eine Schleife, die 6 Sekunden auf das Sicherheitsfenster wartet (das Fenster erschien bei mir nach gut 4 s). Erscheint die Abfrage früher wird sie weggeklickt und das Skript fortgesetzt, erscheint sie nicht, wird das Skript nach 6 s fortgesetzt.

    Alter_Notepad mit GUI:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1)
    Opt("WinTitleMatchMode", 2)

    [/autoit] [autoit][/autoit] [autoit]

    Global $StandarEditorName = 'Microsoft Windows notepad.exe'
    Global $arRadio[3], $InCurrEditor, $LabelSuccess
    Global $alternateEditorPath = ''
    Global $arDest[4] = [ _
    @WindowsDir & '\servicepackfiles\i386\notepad.exe', _
    @WindowsDir & '\system32\dllcache\notepad.exe', _
    @WindowsDir & '\system32\notepad.exe', _
    @WindowsDir & '\notepad.exe']
    Global $start = 0, $RoyalBlue = 0x4169E1, $Orange = 0xFFA500
    If Not FileExists(@WindowsDir & '\servicepackfiles\i386\notepad.exe') Then $start = 1

    [/autoit] [autoit][/autoit] [autoit]

    $GUIAlternateEditor = GUICreate("Standard Editor wechseln (Win2k, WinXP SP2) By BugFix " & _
    "( [email='bugfix@autoit.de'][/email] )", 563, 239, 193, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE, "GUIAlternateEditorClose")
    GUISetBkColor($RoyalBlue, $GUIAlternateEditor)
    $Group1 = GUICtrlCreateGroup("", 10, 10, 540, 209)
    $arRadio[0] = GUICtrlCreateRadio("Launcher installieren, Editor festlegen", 150, 71, 206, 17)
    $arRadio[1] = GUICtrlCreateRadio("Neuen Editor festlegen", 150, 98, 143, 17)
    $arRadio[2] = GUICtrlCreateRadio("Windows Standard wiederherstellen", 150, 126, 196, 17)
    $BtGo = GUICtrlCreateButton("Ausführen", 465, 123, 70, 20)
    GUICtrlSetOnEvent(-1, '_Go')
    $Label1 = GUICtrlCreateLabel("Aktueller Standard Editor:", 20, 40, 124, 17)
    $InCurrEditor = GUICtrlCreateInput("", 150, 37, 385, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    $LabelSuccess = GUICtrlCreateLabel("Bitte Aktion wählen", 150, 174, 385, 23)
    GUICtrlSetFont(-1, 10, 800, 0, "Comic Sans MS")
    GUICtrlSetColor(-1, $Orange)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    If StringLeft(FileGetVersion(@WindowsDir&'\notepad.exe'), 1) = 3 Then
    GUICtrlSetData($InCurrEditor, RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor', 'FullPath'))
    GUICtrlSetState($arRadio[1], $GUI_CHECKED)
    GUICtrlSetState($arRadio[0], $GUI_DISABLE)
    Else
    GUICtrlSetData($InCurrEditor, $StandarEditorName)
    GUICtrlSetState($arRadio[1], $GUI_DISABLE)
    GUICtrlSetState($arRadio[2], $GUI_DISABLE)
    GUICtrlSetState($arRadio[0], $GUI_CHECKED)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func GUIAlternateEditorClose()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Go()
    GUICtrlSetState($BtGo, $GUI_DISABLE)
    GUICtrlSetData($LabelSuccess, '')
    For $i = 0 To 2
    If BitAND(GUICtrlRead($arRadio[$i]), $GUI_CHECKED) Then ExitLoop
    Next
    Switch $i
    Case 0
    _LauncherInstall()
    Local $begin = TimerInit()
    Do
    If WinExists('Windows-Dateischutz') Then
    Send("{ESC}")
    WinWaitActive('Windows-Dateischutz', 'Sie müssen die Dateien')
    Send("!j")
    $begin = 6000
    EndIf
    Sleep(100)
    Until TimerDiff($begin) >= 6000
    GUICtrlSetData($LabelSuccess, '')
    _AlternateSelect()
    GUICtrlSetState($arRadio[0], $GUI_DISABLE)
    GUICtrlSetState($arRadio[1], $GUI_ENABLE)
    GUICtrlSetState($arRadio[2], $GUI_ENABLE)
    GUICtrlSetState($arRadio[1], $GUI_CHECKED)
    Case 1
    _AlternateSelect()
    Case 2
    _RollBack()
    EndSwitch
    GUICtrlSetState($BtGo, $GUI_ENABLE)
    EndFunc ;==>_Go

    [/autoit] [autoit][/autoit] [autoit]

    Func _LauncherInstall()
    RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor', 'OriginalSaved')
    If @error Then
    If FileCopy(@WindowsDir & '\notepad.exe', @WindowsDir & '\notepad.exe.org') = 0 Then ; Sicherheitskopie Original
    MsgBox(262160, 'Kopierfehler', 'Die Sicherheitskopie der "notepad.exe" konnte nicht angelegt werden.')
    Return
    EndIf
    If RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor', 'OriginalSaved', "REG_SZ", 1) = 0 Then
    MsgBox(262160, 'Registryfehler', 'Eintrag in die Registry fehlgeschlagen.')
    Return
    EndIf
    EndIf
    Local $fehler = 0
    For $i = $start To UBound($arDest) -1 ; ####### QUELLPFAD für FileInstall anpassen !!! ########
    If FileInstall("C:\Dokumente und Einstellungen\Standard\Desktop\SCRIPTING\AU3-Scripte\Alternate Notepad\notepad.EXE", _
    $arDest[$i], 1) = 0 Then
    $fehler += 1
    EndIf
    Next
    If $fehler > 0 Then
    GUICtrlSetData($LabelSuccess, 'Fehler bei Installation. Wiederherstellung starten.')
    Return
    EndIf
    GUICtrlSetData($LabelSuccess, 'Installation Launcher erfolgreich. Starte Editorwahl.')
    EndFunc ;==>_LauncherInstall

    [/autoit] [autoit][/autoit] [autoit]

    Func _AlternateSelect()
    GUICtrlSetData($LabelSuccess, '')
    Do
    $alternateEditorPath = FileOpenDialog("Pfad des alternativen Editors auswählen", @HomeDrive, "(*.exe)")
    If $alternateEditorPath = '' Then
    If MsgBox(262180, 'Keine Datei ausgewählt', 'Wollen Sie nochmals wählen?') = 7 Then Return 0
    EndIf
    Until $alternateEditorPath <> ''
    If RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor', 'FullPath', "REG_SZ", $alternateEditorPath) = 0 Then
    GUICtrlSetData($LabelSuccess, 'Auswahl/Registrierung Editor fehlgeschlagen.')
    Else
    GUICtrlSetData($LabelSuccess, 'Alle Vorgänge wurden erfolgreich abgeschlossen.')
    GUICtrlSetData($InCurrEditor, $alternateEditorPath)
    EndIf
    EndFunc ;==>_AlternateSelect

    [/autoit] [autoit][/autoit] [autoit]

    Func _RollBack()
    If Not FileExists(@WindowsDir & '\notepad.exe.org') Then
    MsgBox(262160, 'Dateifehler', 'Die Sicherung der Originaldatei:' & @LF & _
    @WindowsDir & '\notepad.exe.org' & @LF & _
    'ist nicht vorhanden!' & @LF & _
    'Eine Wiederherstellung ohne diese Datei ist nicht möglich!')
    Return
    EndIf
    For $i = $start To UBound($arDest) -1
    If FileCopy(@WindowsDir & '\notepad.exe.org', $arDest[$i], 1) = 0 Then
    MsgBox(262160, 'Kopierfehler', 'Die Original Datei konnte nicht in den Pfad:' & @LF & _
    $arDest[$i] & @LF & _
    'kopiert werden.' & @LF & @LF & _
    'Bitte kopieren Sie die Original "notepad.exe" in GENAU dieser Reihenfolge' & @LF & _
    'in die folgenden Pfade:' & @LF & _
    @WindowsDir & '\servicepackfiles\i386\ (sofern vorhanden)' & @LF & _
    @WindowsDir & '\system32\dllcache\' & @LF & _
    @WindowsDir & '\system32\' & @LF & _
    @WindowsDir & '\')
    GUICtrlSetData($LabelSuccess, 'Fehler bei Wiederherstellung.')
    Return
    EndIf
    Next
    RegDelete('HKEY_LOCAL_MACHINE\SOFTWARE\AlternateEditor', 'FullPath')
    GUICtrlSetData($LabelSuccess, 'Wiederherstellung erfolgreich beendet.')
    GUICtrlSetData($InCurrEditor, $StandarEditorName)
    GUICtrlSetState($arRadio[0], $GUI_ENABLE)
    GUICtrlSetState($arRadio[1], $GUI_DISABLE)
    GUICtrlSetState($arRadio[2], $GUI_DISABLE)
    GUICtrlSetState($arRadio[0], $GUI_CHECKED)
    EndFunc ;==>_RollBack

    [/autoit]