将快捷方式 “固定到任务栏” 的功能在 Win10 上一直无法实现,困扰了我许久。但是最近体验迅雷U享版的时候发现,程序一安装完居然自动固定到了任务栏,所以最近有空又重新研究了下。
Win7下这样一行代码就行了,但是在Win10上这个方法被限制了。
1 | ShellExecute(NULL, "taskbarpin", "path to link", NULL, NULL, 0) |
谷歌一番后发现了这篇 文章 实现了这功能,代码是C#的。实现方式是模拟用户点击快捷方式的右键菜单中的“固定到任务栏”。
C++实现
默认情况下代码获取到的快捷方式右键菜单项是没有“固定到任务栏”的,查资料发现是Win10又添加了限制,判断了当前程序名是否是 explorer.exe,否则返回的项不会包含“固定到任务栏”或“从任务栏取消固定”。
基本思路:
1.取得当前程序的PEB(通过NtQuerySystemInformation)
2.修改 PEB 里 PRTL_USER_PROCESS_PARAMETERS 中的 ImagePathName
3.列出菜单项模拟点击
注意: 新构造的 ImagePathName 长度不能比原来的 ImagePathName.Length 长,不然修改会失败。
代码
在 Win7,Win8.1,Win10上测试通过,XP上运行没有效果。
注: Win10 LTSB 2015 (1511)无效,但360浏览器和迅雷U享版都支持,暂时无解 :(。 2018年2月27日
1 |
|
参考
Pinning a network program with a Jump List to the taskbar programmatically in windows 10 – Part 1
https://stackoverflow.com/a/38880235
Manually Enumerating Process Modules