首页
社区
课程
招聘
[原创]修补增强WindowsXP SP3的Ctrl+Z撤销键
发表于: 2016-3-27 03:04 10886

[原创]修补增强WindowsXP SP3的Ctrl+Z撤销键

2016-3-27 03:04
10886

    说些题外话, 不想看的直接从下面的"分割线"以下开始看. 
    可能很多人一进本贴, 就会喊道: 你怎么还用XP啊?
    不可否认, win7是很优秀的系统, 有着靓丽的外观与舒适的多媒体体验, 但现在XP仍然占有着用户市场第二的份儿, 在12%~16%间浮动, 略高于win8.
   毕竟XP发展时间长久, 稳定性获得世界认可. 例如银行ATM机上的系统就有用XP的.

    XP并没有十全十美, 在市场份额下降以后, 微软狠心将其抛弃, 话说不再发布针对XP的补丁. 留守XP的用户想获得微软更多的梦想支持化为泡影. 无奈之下只能靠一些民间的修补, 例如4G内存支持补丁等.

    鄙人在此也班门弄斧, 将XP系统资源管理器的CTRL+Z键改造, 为造福XP用户贡献一点微薄的力量.

-------------------------------------------分割线-------------------------------------------

    大家可能碰到过这样的问题, 就是习惯使用快捷键CTRL+Z对编辑文档做撤销操作, 很是方便.
    使用Windows的资源管理器对文件进行管理时, 同样支持CTRL+Z操作, 当复制文件到某个位置时, 按下组合快捷键CTRL+Z(或者在右键里选择"撤销复制"), 会弹出是否删除掉刚刚复制过去的文件的询问窗口. 
    然而, 如果是移动文件的话, 按下组合快捷键CTRL+Z(或者在右键里选择"撤销移动"), 会直接将移动的文件移回原来的位置, 要命的是大多数情况下, 不提示任何信息!  文件数量多或者文件较大并且是在不同分区间移动的时候, 撤销时会有移动回去的进度, 这能算提示么? 这根本是移动文件的提示而不是撤销提示.
    如果是刚刚进行移动的, 还好, 还知道被撤销移动的是什么文件. 但如果是10分钟前, 或者去吃饭回来, 不小心按下"撤销移动"(或CTRL+Z)呢? 也许一闪而过, 也许连这一闪而过都没有. 你还记得吃饭前移了什么东西么? 毫无疑问, 不出所料, 文件已经溜回原来的地方睡大觉去了! 
    这只是列举了一种情况, 当然还可能有其他原因造成的误撤销操作, 例如你在编辑某文件之类的, 软件界面突然直接消失了, 而此时你恰好错误的在桌面或在其他资源管理器所属的文件夹中按下CTRL+Z, 本来是要撤销正在编辑文件的某些修改, 无意中成为了撤销资源管理器的文件操作, 如果刚才移动了某些文件, 悲催了, 大部分不记得刚才移动了什么了.

    我提供的这个修改就是防止那些已被整理的文件不打报告就偷偷溜回原来地方.
以下是大致修补的关键代码及注释:   
(20160330的新补丁已在下面代码基础上进行了更进一步修正, 想研究的请加载补丁自己跳转到地址 7D78E920 )

;-------------代码开始-------------

        CMP DWORD [EAX+4],1
        JNZ SHFileOperationW
        PUSHAD
        PUSH 0                                                ;供存放判断标志

        PUSH 738                                                ;申请内存大小
        PUSH 40
        CALL LocalAlloc                                        ;申请内存
        MOV EDI,EAX                                        ;存储内存指针到EDI
        TEST EDI,EDI
        JE SHORT @NOMOVE                        ;如果申请内存失败跳走
        PUSH EDI                                                ;存储起来供释放
        MOV EAX,DWORD [ESP+2C]
        PUSH [EAX+C]                                        ;%s  源
        PUSH [EAX+8]                                        ;%s  目标
        PUSH @Format                                        ;要格式化的字符串
        PUSH 600                                                ;最大允许用到的内存大小
        PUSH EDI                                                ;申请得到内存
        CALL wnsprintfW
        ADD ESP,14
        MOV EAX,DWORD [ESP]
        PUSH 24
        PUSH @BeToMove                                ;窗口标题
        PUSH EAX                                                ;要显示的格式化内容
        CALL GetActiveWindow
        PUSH EAX
        CALL MessageBoxW
        MOV DWORD [ESP+4],EAX                ;将判断标志存储
        CALL LocalFree                                        ;释放内存
        CMP BYTE [ESP],6
        JNE SHORT @NOMOVE
@YESMOVE:
        ADD ESP,4
        POPAD
        JMP SHFileOperationW
@NOMOVE:
        ADD ESP,4
        POPAD
        RETN 4

DD 00000000
DD 00000000
DD 00000000

@Format:

        DB 60 4F 6E 78 9E 5B 81 89 A4 64 00 95 FB 79 A8 52
        DB 3A 00 09 00 0D 00 0A 00 1C 20 25 00 73 00 1D 20
        DB 09 00 0D 00 0A 00 30 52 0D 00 0A 00 1C 20 25 00
        DB 73 00 1D 20 17 54 3F 00 09 00 00 00 00 00 00 00

@BeToMove:

        DB 73 53 06 5C A4 64 00 95 FB 79 A8 52
        DB 00 00

;-------------代码结束-------------

    修补后的具体效果请点击图片查看下面的动态gif演示图, 比我文字描述的更直观!



————————————————2016-03-30已更新修补————————————————
强烈建议原先下载过的雪友重新下载并使用最新的修补
1. 解决本人三楼提到的回收站文件偷溜回去问题, 即增加了对回收站撤销删除的判断, 如下所示.

2.改为更人性化的 "回到目标目录" 的提示.
    改进后


20160330新版
32位补丁文件:

因为有大家的支持, 我会尽可能完善.


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (14)
雪    币: 6
活跃值: (1509)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
XP  习惯而已   但是新系统是必须换的。我感觉电脑被人黑了很多年了。但是还是舍弃不了XP,怀念而已 至永恒
2016-3-27 04:07
0
雪    币: 47147
活跃值: (20420)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
有类似的经历,这功能还是有用的,现在主要是用win7
2016-3-27 08:33
0
雪    币: 746
活跃值: (3395)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
4
有点意思有点意思
2016-3-27 11:03
0
雪    币: 259
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
感谢论坛老大百忙之中抽空过来查阅并回复LZ的帖子。

windows7资源管理器已经有了更完善的撤销重做功能。
LZ这个修正仍然带有一定的局限性,如果是一次移动好多个文件或文件夹,撤销移动的时候,只有其中某一个文件或文件夹作为像包工头一样的代表,大队伍跟着包工头撤销回去。

更完善
2016-3-27 11:22
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼主
2016-3-27 13:56
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
必须换win7了吧,安装xp win7双系统来习惯了5年才最终换成了win7。    因为在笔记本电脑上xp没有独立显卡的驱动,这是最致命的地方,唉。
2016-3-27 14:20
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
8
感谢分享~虽然主机不用XP,不过虚拟机还是经常用到XP的。
2016-3-27 14:37
0
雪    币: 433
活跃值: (1900)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
GIF看了五分钟我才反应过来
2016-3-28 10:23
0
雪    币: 129
活跃值: (333)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xed
10
桌面右键是用的注册表么?
HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers
2016-3-28 11:42
0
雪    币: 243
活跃值: (247)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
目前办公还在xp环境下,支持一下,给力的修复。
2016-3-28 16:22
0
雪    币: 202
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
有几个问题要请教
1、是怎么知道要在那个地方修改的?
2、怎么没见到调用正常处理程序的过程?
2016-3-29 17:09
0
雪    币: 259
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
文件移动操作由 SHFileOperationW 负责, 本补丁原理通过拦截调用 SHFileOperationW 的地方进行判断.
2016-3-30 05:59
0
雪    币: 202
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
但你的目的是处理ctrl+Z这个快捷键,为什么不处理对快捷键处理的相关过程,而是拦截文件处理过程呢SHFileOperationW? ,这个函数可以判断文件移动操作,但对调用源没有限制,那么你的处理不光影响了ctrl+z,还影响了所有其他文件操作,是不是这样?
2016-3-30 11:04
0
雪    币: 259
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
这个函数的结构中有一个参数数据很简单,是1时,是移动。其他值的时候是拷贝删除重命名之类的,可以自己去查阅。

SHFileOperationW是针对文件和文件夹操作,我并没有截持这个函数。
另外我只针对系统的撤销移动和撤销删除操作进行修改,这两个操作调用了SHFileOperationW而已。任何情况调用到SHFileOperationW不会受到影响。

windows7的撤销同样是没有提示的,但是有ctrl+y重做。而windows xp没有ctrl+y重做。
2016-3-30 14:49
0
游客
登录 | 注册 方可回帖
返回
//