作为this link suggests,我想通过运行命令
使用“图像文件执行选项”功能将Notepad.exe
替换为Notepad2.exe
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe"
/v "Debugger" /t REG_SZ /d "\"c:\windows\Notepad2.exe\" /z" /f
但是当我运行记事本时,它仍会打开文件
默认情况下,在notepad2.exe中将C:\ WINDOWS \ Notepad.exe的
作为文本文件。
有没有办法避免这种情况?
我知道使用这个技术Notepad.exe将作为传递给Notepad2.exe的第一个参数。但我不知道如何避免这种情况:(
答案 0 :(得分:15)
"调试器的目的" key是自动启动调试器并将原始命令行传递给所需的调试器。它还在win32函数CreateProcess上设置一个标志,指示这是一个调试会话。
暗示调试器将在适当修改参数后调用CreateProcess。
>notepad.exe "\document1.txt"
变成
>mydebugger.exe notepad.exe "\document1.txt"
mydebugger可以调用这样的东西:
BOOL res = CreateProcess( NULL, L"notepad.exe \"\\document1.txt\", NULL, NULL,
FALSE, cFlags, env, NULL, startupInfo, procInfo&);
因此,滥用此注册表项的解决方案是 制作可以按照您希望的方式操作命令行的假调试器。 这应该是一个简单的过程,只需解析命令行并用notepad2.exe替换notepad.exe。然后,您需要将注册表指向该.exe
答案 1 :(得分:4)
对于Notepad ++,为了解决“notepad.exe”作为文档引入的问题,创建一个简单的启动器批处理文件(请参阅@ Ben的答案为什么),然后将图像调试器指向该处(la @ fenster的答案) )。
nppLauncher.bat:
if exist "C:\Program Files\Notepad++\notepad++.exe" start "" "C:\Program Files\Notepad++\notepad++.exe" %2 %3 %4 %5 %6 %7 %8 %9
if exist "C:\Program Files (x86)\Notepad++\notepad++.exe" start "" "C:\Program Files (x86)\Notepad++\notepad++.exe" %2 %3 %4 %5 %6 %7 %8 %9
添加到注册表:
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /t REG_SZ /d "\"...\path\to\nppLauncher.bat"" /f
答案 2 :(得分:3)
Notepad Replacer使用了这种技术,但它非常易于使用,并且可以使用不支持调试器的编辑器。
答案 3 :(得分:1)
来自Here 用Notepad2 4.1.24(或更新版本)替换Windows记事本
从版本4.1.24开始,Notepad2的官方发行版支持此方法替换Windows记事本,因此上述步骤可以正常工作。但是,由于Notepad2的官方发行版不会修改系统注册表,因此不支持自动执行记事本替换。出于同样的原因,默认情况下不支持通过Windows 7跳转列表访问最近的文件(这需要首先在系统注册表中注册应用程序)。
另请注意,如果将Notepad2用作便携式设备的记事本替代品,则自动记事本替换可能会产生不良影响,并且断开设备时原始状态未恢复。
从Notepad2目录运行并替换Windows记事本的批处理脚本可能如下所示(需要提升权限):
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /t REG_SZ /d "\"%~dp0Notepad2.exe\" /z" /f
可以使用此命令恢复Windows记事本(需要提升权限):
reg delete "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /f
通过打开Regedit并查看[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]
来验证结果。 Debugger键应包含notepad2.exe的完整路径,并包含尾随/z
,例如:
c:\local\bin\Notepad2.exe /z
答案 4 :(得分:0)
我使用以下批处理文件打开emacs而不是记事本。我还包括一个绕过它的参数,这样我仍然可以在需要时使用记事本。例如从提升的命令提示符编辑hosts文件:
notepad --NOTEPAD C:\Windows\System32\drivers\etc\hosts
将它放在路径上的某处并编辑最后一行以打开文本编辑器:
@echo off
setlocal enabledelayedexpansion
::Sometimes you really want to use notepad (e.g. edit hosts file from an elevated command prompt)
if "_%~2_" == "_--NOTEPAD_" (
set "REALLY_NOTEPAD=TRUE"
)
:: For testing calling notepad again without removing debugger registry key
:: making sure there's not an infinite loop!
if "_%~2_" == "_STOPSTOPSTOP_" (
start "" echo FAILED TO START NOTEPAD 2
exit /b 1
)
set "NOTEPAD=%~1"
:: SHIFT command will not affect the value of %* which holds all the original arguments %1 %2 %3
:: So need to remove notepad from "%*" all params variable
:: Prepending --START-- in case %NOTEPAD% appears in params
:: Quotes as NOTEPAD will /sometimes/ be in them in all params
set "ALL=%*"
set "ALLPARAMS=--START--%*"
set "ALLPARAMS=!ALLPARAMS:--START--"%NOTEPAD%"=--START--!"
set "ALLPARAMS=!ALLPARAMS:--START--%NOTEPAD%=--START--!"
:: Also remove /multiple/ spaces between NOTEPAD and parameters
set "ALLPARAMS=!ALLPARAMS:--START-- =--START--!"
set "ALLPARAMS=!ALLPARAMS:--START-- =--START--!"
set "ALLPARAMS=!ALLPARAMS:--START-- =!"
:: Also remove --NOTEPAD if present
set "ALLPARAMS=!ALLPARAMS:--START----NOTEPAD=--START--!"
set "ALLPARAMS=!ALLPARAMS:--START-- =--START--!"
set "ALLPARAMS=!ALLPARAMS:--START-- =--START--!"
set "ALLPARAMS=!ALLPARAMS:--START-- =!"
:: and --START--, just in case
set "ALLPARAMS=!ALLPARAMS:--START--=!"
IF "_%ALLPARAMS%_" == "__" (
:: Open a scratch buffer in emacs if no params
set "ALLPARAMS=**SCRATCH**"
)
:: Unicode support (I hope)
chcp 65001
::TEST not removing debugger registry key
::if "_%REALLY_NOTEPAD%_" == "_TRUE_" start "" notepad STOPSTOPSTOP && exit /b
if "_%REALLY_NOTEPAD%_" == "_TRUE_" (
reg DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /F
start "" notepad !ALLPARAMS!
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /t REG_SZ /d "%~0"
exit /b 0
)
C:\path\to\emacs\bin\emacsclientw.exe -na C:\path\to\emacs\bin\runemacs.exe "!ALLPARAMS!"
使用此命令将其设置为替换记事本:
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v "Debugger" /t REG_SZ /d "c:\path\to\wherever\you\savced\script-above.cmd"
或者只是像这样调用脚本:
SCRIPT JUNK --NOTEPAD
应调用记事本,但之后用此脚本替换