有一些针对资源管理器的注册表设置,设置后,不能立即生效,所以只能试试 (重启资源管理器也不一定生效)“重启资源管理器”。
而我个人习惯,桌面图标(有100多个)是按自已习惯的位置放的,并不勾选“自动排列”的,因为“自动排列”会重新排图标位置,对于我来说,就全乱了。按自已长期习惯放常用的桌标,能一下就找到。
近期做了一个功能,要“重启资源管理器”,所以为了让资源管理器先保存桌标位置,再自动退出。折腾了不少时间。主要是有一条定义 TM_ExitExplorer 的常量,不知当时为什么没有加上这条定义,后来相关文件没有了,只能自已想办法补这一条了:
我们都知,Explorer 定义的各种消息常量有2000多行, 比如:
TM_BRINGTOTOP = (WM_USER + $152);
TM_WARNNOAUTOHIDE = (WM_USER + $153); //警告没有自动隐藏
TM_WARNNODROP = (WM_USER + $154);
TM_NEXTCTL = (WM_USER + $155);
TM_DOEXITWINDOWS = (WM_USER + $156); // 弹出 退出 WINDOWS 之类的
// 原定义找不到,自已补一下, WIN7 到 WIN11 测试通用,其它系统没有试
TM_ExitExplorer = $5B4;
.....下面还有大量的定义,比如:
TM_RAISEDESKTOP = (WM_USER + $179); //显示桌面
// 这二条常量都可以刷新桌面, 上面和命令都能通用所有系统。除 TM_ExitExplorer 这条我自已补的
FCIDM_REFRESH = (FCIDM_BROWSER_VIEW + $0020);
FCIDM_REFRESH_REAL = $0a220;
IDS_MH_CONNECT = (MH_ITEMS+FCIDM_CONNECT ); // 连接
IDS_MH_DISCONNECT = (MH_ITEMS+FCIDM_DISCONNECT); //断开连接
function MyReStartExplorer : Boolean;
var
dwPID, dwErrorCode, dwWaitValue : DWORD;
hTrayWnd : HWND;
hProcess : THandle;
begin
dwWaitValue:=0;
hTrayWnd:=MyGetShell_TrayWnd; //相当于 FindWindowW('Shell_TrayWnd', nil)
if hTrayWnd > 0 then
begin
GetWindowThreadProcessId(hTrayWnd, @dwPID);
hProcess := MyOpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, dwPID, dwErrorCode);
//通知 Explorer 触发保存托盘和桌面、TermSoundWindow、 DoExitExplorer 等
MyPostMessage(hTrayWnd, TM_ExitExplorer, 0, 0);
if hProcess > 0 then
begin
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2025-8-12 19:57
被kagayaki编辑
,原因: