如何让编程创建的快捷方式在「最近使用的项目」中持续可见不消失?
如何让编程创建的快捷方式在「最近使用的项目」中持续可见不消失?
这个问题我之前踩过坑!核心原因是Windows的「最近使用的项目」(也就是C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Recent文件夹)根本不是普通文件夹——它背后是系统维护的使用记录数据库,资源管理器显示的内容其实是这个数据库的视图,而非文件夹里的所有文件。你直接把自己创建的.lnk丢进去,系统会判定这是“无主”的无效条目,很快就会把它从视图里清理掉,虽然文件本身还留在文件夹里。
要解决这个问题,得顺着Windows的规则来,用系统认可的方式添加最近项,而不是手动操作文件。下面给你两种靠谱的方法:
方法一:用系统API直接添加(最推荐)
Windows提供了专门的SHAddToRecentDocs函数,用来告诉系统“这个文件/文件夹被使用了”,系统会自动帮你在Recent文件夹生成合法的快捷方式,而且绝对不会被莫名清理。
比如用PowerShell实现的话,你可以这样写:
# 定义API签名 $signature = @" [DllImport("shell32.dll")] public static extern void SHAddToRecentDocs(uint flags, string path); "@ # 加载API $shell32 = Add-Type -MemberDefinition $signature -Name Shell32 -Namespace Win32 -PassThru # 把目标文件添加到最近项 $shell32::SHAddToRecentDocs(0, "C:\Path\To\Your\Target.exe") # 或者添加文件夹 $shell32::SHAddToRecentDocs(0, "C:\Path\To\Your\Folder")
运行这段代码后,你会发现目标的快捷方式正常出现在「最近使用的项目」里,而且不会消失——因为这是系统自己生成的“正规军”。
方法二:创建快捷方式后通知系统刷新(备选)
如果你一定要自己创建快捷方式再放到Recent文件夹,那创建完成后必须通知系统刷新它的最近项数据库,让系统识别这个快捷方式是有效的。
同样用PowerShell举例,先创建快捷方式,再调用SHChangeNotify通知系统:
# 先创建快捷方式到Recent文件夹 $ws = New-Object -ComObject WScript.Shell $shortcutPath = "$env:APPDATA\Microsoft\Windows\Recent\MyShortcut.lnk" $shortcut = $ws.CreateShortcut($shortcutPath) $shortcut.TargetPath = "C:\Path\To\Your\Target.exe" $shortcut.Save() # 定义SHChangeNotify的API签名 $signature = @" [DllImport("shell32.dll")] public static extern void SHChangeNotify(uint eventId, uint flags, IntPtr item1, IntPtr item2); "@ $shell32 = Add-Type -MemberDefinition $signature -Name Shell32 -Namespace Win32 -PassThru # 通知系统刷新文件系统 $shell32::SHChangeNotify(0x00000002, 0x00000001, [IntPtr]::Zero, [IntPtr]::Zero)
不过这种方法不如第一种稳定,毕竟还是绕开了系统的原生管理逻辑,优先推荐方法一。
为啥会出现你说的那些奇怪现象?
- 你在
dir里能看到快捷方式,但资源管理器看不到:因为资源管理器显示的是系统数据库里的有效条目,不是文件夹的实际内容,无效条目会被过滤掉。 - 手动创建会加(2):因为系统数据库里已经有对应目标的记录了,只是资源管理器没显示出来,手动创建时系统检测到重复,所以自动加后缀。
备注:内容来源于stack exchange,提问作者mathlete
相关产品推荐
相关产品推荐

