Mhlink替换notepad为notepad3问题

事情的起因是:1、因为最近在写一点批处理,所以不满足于功能过于简单的notepad,所以想用notepad3替代之;2、因为最近系统重装比较频繁,每次装软件并调整软件设置的过程让人吐血,所以想用软件的官方免安装版替代之;3、发现不少软件的免安装版不提供文件关联功能,在Win10系统只能每种文件类型通过右键“打开方式”菜单选择程序来关联(是每种扩展名设一次…心塞)。
所以,我突发奇想:能否删除系统自带组件,然后用mhlink原地建立一个同名链接指向第三方免安装软件,可行的话上面的三条问题都解决了。
我先尝试的是替换notepad:首先删除c:\windows、c:\windows\system32、c:\windows\syswow64下的notepad.exe;然后用mhlink命令在三个位置各建立一个名为notepad.exe且指向d:\notepad3\notepad3.exe的链接;完成后系统与notepad相关的功能成功被转向了notepad3。
但是,发现打开文件时notepad3会弹窗提示语言包变量有错,确定文件可成功打开,但notepad3的界面为英文了(直接去d:\notepad3中启动软件是正常的)。向能手搓的大佬们求助,上述思路是否有问题?notepad3出现的这个问题该如何解决?
(明天再试试看用同样方法处理wmp是否可以成功)

notepad3本身就有替换notepad的功能,用映像劫持实现的。
推荐用映像劫持功能替换系统自带的软件,最好不要乱删系统文件,哪怕是个记事本。
可以在重装系统前把文件关联有关的注册表项都备份,重装后直接导入,免得一个个重新设置关联。
映像劫持之类的也可以通过备份注册表相关项直接备份。

notepad3安装有替代功能,免安装版貌似软件里没有该功能。
常用功能软件里FastStone Image Viewer便携版、smplayer便携版都不能加入默认程序,aimp便携版倒是提供了添加默认程序的功能。

硬链接替代的时候,notepad3的其他部分,比如语言文件夹和配置都要硬链接一份

最安全的还是映像劫持,微软官方教的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe
新建名字叫Debugger的字符串,双击修改为notepad3的路径

这种什么都不需要改变

2 Likes

“硬链接替代的时候,notepad3的其他部分,比如语言文件夹和配置都要硬链接一份”,从你的回复理解了:快捷方式是转移到目标地点运行程序,mklink则是虚拟到链接位置运行。所以c:\windows、c:\windows\system32、c:\windows\syswow64目录下的的链接运行时就在c:\windows、c:\windows\system32、c:\windows\syswow64找语言文件包了,我刚刚在上述位置建立了notepad3语言包文件夹的链接,果然就不报错了。
但是这样就不是链接一个程序文件的问题了,要把相关文件和文件夹都链接过来才能保证程序正常运行,所以还是要想你回复的,用映像劫持了。

1 Like

映像劫持在99%的时候都没问题,但是有些特殊场景会打不开文件,
比如我遇到搜狗输入法自定义配置,选择打开文本修改的时候,只会显示个空白文件,要取消映像劫持才能打开临时自定义配置文件
可能也有其他场景,以后你遇到也不要慌张,临时取消一下就行

感觉这是个典型的X-Y Problem,正确做法应该是找找有没有批量设置文件关联的工具。
另外要推荐文本编辑器的话,个人推荐KDE的Kate kate-editor.org ,功能丰富、界面好看,也没有vscode那么重。

1 Like

vim 的替换

我也曾尝试过把 notepad.exe 替换为 vim ,用的也是硬链接的方式,https://www.howtogeek.com/howto/12617/how-to-replace-notepad-in-windows-7/

但是遇到以下问题:

notepad 的打开文件的方式,notepad.exe {文件路径}

这里的 {文件路径} 只能是一个文件的路径,如 c:/users/test.txt

替换为 vim 后,多数情况下都正常,只有当路径中含有空格时,vim 会将后面的参数看作以空格分开的多个文件。

# 创建 "a b.txt"
% notepad a b.txt

# 但是对于 vim ,则是创建 a, b.txt 两个文件
% vim a b.txt

由于 notepad 后面的 {文件路径} 只能有一个,我猜测,肯定是系统调用 notepad.exe 时,没有给后面的参数加上双引号。

我尝试过用 python 调用 vim 再打开 txt.

from sys import argv   # 读取命令行参数
from os import system  # 执行 cmd 命令

argvs = argv[1:]         # 得到除第 0 个参数外的所有参数
f_path = ' '.join(argvs) # ' '.join() 空格, 得到目标文件的路径


if f_path == '':  # 如果给出的路径为空,则创建新文件
    input('将直接打开 vim, 按回车键继续')
    system('vim')
else:             # 编辑指定文件
    cmd = 'vim ' + '"' + f_path + '"'
    system(cmd)

我将上面的代码编译并重命名为 notepad.exe 并替换真正的 notepad.exe,成功了。

所以我的猜测是对的,在传给 notepad.exe 文件路径时,后面的 {文件路径} 没有用引号括起来,而是 notepad.exe 自己括起来再打开。

以上可以实现右键菜单中的 Edit 打开文件也使用 vim

命令行使用命令修改文件类型与打开方式, assoc 与 ftype

这个思路很好。

我找到一个批量设置的方法:

举例:

替换 .txt 的默认程序

# 查看 .txt 绑定的文件类型
% assoc .txt
.txt=txtfile

# 查看 txtfile 的对应的打开程序
% ftype txtfile
txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1

# 修改 txtfile 对应的打开程序
% ftype txtfile="C:\2.vim_portable\gVimPortable.exe" "%1"
txtfile="C:\2.vim_portable\gVimPortable.exe" "%1"

以上能实现双击 .txt 使用 vim 打开,但是,不能实现右键菜单中的 Edit 也使用 vim。

reference

1 Like

@bcaso 的vim替换解决方案值得借鉴呀,我也试试看,看用同样的编写跳转程序替换的方法是否可以把默认的视频、看图软件替换掉。

ftype 命令可以做到备份并还原:

Backup FileTypes

FTYPE >backup_types.txt
ASSOC >backup_ext.txt

Restore FileTypes from a Backup

FOR /F “tokens=* delims=” %G IN (backup_types.txt) DO FTYPE %G
FOR /F “tokens=* delims=” %G IN (backup_ext.txt) DO ASSOC %G

This will recreate the CLASS id’s in the registry at HKey_Classes_Root.
If you put the commands above in a batch file change the %G to be %%G

reference

https://ss64.com/nt/ftype.html

1 Like

传递参数的问题,可以在映像劫持的路径后面添加/z
比如
“d:\123\notepad.exe” /z

notepad3还是有些问题,在linux子系统下建的文本文件,utf8编码,但打开就是乱码。编码方面,notepad还是离不开。。。

UTF8有两种,Linux用无BOM的,Windows用有BOM的,你确定你打不开的那个文件,在Win下有转换成有BOM的吗?QWQ

是linux下的无bom的,但是记事本本身是可以正常打开的。所以说,还是不可或缺。毕竟,写完了很久,谁也不会去记得这东西当时用什么写的。