首页
社区
课程
招聘
[原创]菜鸟DIY---为计算器增加退出动画效果
发表于: 2008-11-1 01:48 34593

[原创]菜鸟DIY---为计算器增加退出动画效果

2008-11-1 01:48
34593

【文章标题】: 菜鸟DIY---为计算器增加退出动画效果
【文章作者】: stalker
【作者邮箱】: zhangke_1989 at hotmail dot com
【软件名称】: calc.exe
【下载地址】: 系统目录
【操作平台】: Windows XP SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  学校的校园网慢得可以。以前我一直天真地认为,无法打开网页只有在掉线时才会发生,现在我终于醒悟了。
  在电脑面前呆得实在是无聊,再次拿计算器来开刀,这次的目的是让它在退出的时候有点动画效果。
  首先介绍一个Windows API,名为AnimateWindow,熟悉的可以跳过了。它的原型如下:
  BOOL AnimateWindow(HWND hwnd,DWORD dwTime,DWORD dwFlags);
  MSDN对这个函数做了如此阐述:The AnimateWindow function enables you to produce special effects when showing
  or hiding windows. There are four types of animation: roll, slide, collapse or expand, and alpha-blended fade.
  简单的说就是该函数可以让你在显示或隐藏窗体的时候产生特别的效果,共有四种类型的动画。
  参数hwnd是需要产生特效的窗口句柄,dwTime为动画持续时间,dwFlags代表使用何种动画。
  主角介绍完了,下面正式开始------------------------------------>
  大家都知道,要进行DIY,首先得找对地方,我们要在计算器退出的时候产生一个动画效果,肯定得找到处理WM_CLOSE
  消息的地方。OD载入calc.exe,右键->查找->所有分支,然后在任意一分支上点右键->列出switch的case
  列不了几次,我们就会找到,如图一所示

  双击WM_CLOSE,就会来到相应的代码处
  可能聪明的你会发现,在另一个case中也出现了WM_CLOSE,如图二

  哪一个才是我们想找的呢?下个断点试试吧,分别双击来到各自代码处,然后下断,运行程序,再点X关闭程序,
  断在哪个点哪个点就是了(^_^)
  实验证明,图一那个case是目标,点击它,来到这里
  0100623F  |> \A1 744D0101   mov     eax, dword ptr [1014D74]         ;  Case 10 (WM_CLOSE) of switch 01006124
  01006244  |.  33DB          xor     ebx, ebx
  01006246  |.  3BC3          cmp     eax, ebx
  01006248   . /74 11         je      short 0100625B
  0100624A   . |53            push    ebx                              ; /lParam => 0
  0100624B   . |53            push    ebx                              ; |wParam => 0
  0100624C   . |6A 10         push    10                               ; |Message = WM_CLOSE
  0100624E   . |50            push    eax                              ; |hWnd
  0100624F   . |FF15 3C110001 call    dword ptr [<&USER32.SendMessageW>; \SendMessageW
  01006255   . |891D 744D0101 mov     dword ptr [1014D74], ebx
  0100625B   > \FF35 6C4D0101 push    dword ptr [1014D6C]              ; /hWnd = NULL
  01006261   .  FF15 78110001 call    dword ptr [<&USER32.DestroyWindo>; \DestroyWindow
  哈哈,我们只要把0100623F处的代码改为一个跳转,跳到我们自己的地方,然后再跳回来就可以了
  现在就开始写我们自己的代码了吗?请别着急,还有一个问题,AnimateWindow函数的第一个参数是窗口句柄,我们如何
  得到计算器的主窗口句柄呢?在上一次DIY的时候我使用的方法是GetForegroundWindow来获得的,因为我实在没有想出更好的
  方法,该方法不能够保证万无一失。
  这次我们有很好的条件(^_^),请注意观察上面代码中0100625B处的代码
  0100625B   > \FF35 6C4D0101 push    dword ptr [1014D6C]
  压入的是DestroyWindow函数的参数,而该参数就应当是计算器的主窗口句柄
  稍微有经验的人都应该知道[1014D6C]相当于一个全局变量吧
  由于我们要在0100623F处就让程序跳走,因此先在0100623F处下一个断点,运行程序,用Spy++获得主窗口句柄,
  点X关闭程序,断下来之后,在命令行输入D 1014D6C,观察存储的值是否与Spy++获得的窗口句柄一致。事实证明,果然是
  一致的(^_^)
  下面开始找地方写代码了,我找了010002ED这个地方,由于计算器并没有导入AnimateWindow这个华丽的函数,因此需要用工具
  或者手动增加导入函数。而我选择的是在代码中使用LoadLibrary&GetProcAddress这一黄金搭档来动态获得该函数的地址,
  具体代码如下
  010002ED    60              pushad                                   ;保存寄存器            
  010002EE    68 6C6C0000     push    6C6C
  010002F3    68 33322E64     push    642E3233
  010002F8    68 75736572     push    72657375
  010002FD    8BC4            mov     eax, esp
  010002FF    50              push    eax
  01000300    FF15 24100001   call    dword ptr [<&KERNEL32.LoadLibrar>; kernel32.LoadLibraryA
  01000306    6A 77           push    77
  01000308    68 696E646F     push    6F646E69
  0100030D    68 61746557     push    57657461
  01000312    68 416E696D     push    6D696E41
  01000317    8BDC            mov     ebx, esp
  01000319    53              push    ebx
  0100031A    50              push    eax
  0100031B    FF15 28100001   call    dword ptr [<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
  01000321    68 08000100     push    10008                            ; 动画效果为从下往上收拢
  01000326    68 B80B0000     push    0BB8                             ; 动画时间为3000ms
  0100032B    FF35 6C4D0101   push    dword ptr [1014D6C]
  01000331    FFD0            call    eax
  01000333    83C4 1C         add     esp, 1C                          ;平衡堆栈
  01000336    61              popad                                    ;恢复寄存器
  01000337    A1 744D0101     mov     eax, dword ptr [1014D74]         ;原来的这行代码被修改为跳转了
  0100033C  - E9 035F0000     jmp     01006244                         ;跳回原来的位置继续执行
  
  最后再把
  0100623F  |> \A1 744D0101   mov     eax, dword ptr [1014D74]
  修改为
  0100623F   >-\E9 A9A0FFFF   jmp     010002ED                        
  
  就大功告成了,最后保存到可执行文件试试吧
  附上一个正在收拢的计算器

  
  附件中包含我修改好的计算器
mycalc.rar
  
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  本来想在启动的时候也弄一个效果,无奈太菜,没有弄出来,改天再想想。如果哪位朋友弄出来了,一定分享下(^_^)
  1点早已过去,终于能够打开网页了,心情无比舒畅,可惜身体无比疲劳......
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年11月01日 1:41:22


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (73)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
2
效果很善啊很善
2008-11-1 07:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
03系统运行不了!
2008-11-1 09:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
哦,知道了………………
2008-11-1 09:25
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
牛B王大哥,很善是什么意思啊?还请多指点
2008-11-1 09:40
0
雪    币: 2575
活跃值: (502)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
6
善相当于好。感觉应是“很好”的意思。
2008-11-1 10:25
0
雪    币: 445
活跃值: (25)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
windows自带的的计算器跟扫雷还真惨啊,整天被人折腾,都搞得面目全非了
2008-11-1 11:06
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
8
然                也
2008-11-1 16:57
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
9
NBW变成牛B王了啊,哈哈
2008-11-1 17:09
0
雪    币: 4396
活跃值: (4383)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
........呵呵..... 用英文的搞定~
2008-11-1 19:03
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
11
楼上的兄弟,我在前些时候也做过,用的是看雪页面的OD,在程序启动的时候实现了淡入淡出的效果,不过我觉得调试器最好不要乱搞,会造成不稳定。
2008-11-1 19:24
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
12
原来如此,过奖了
刚才校园网集体掉线,趁重新登陆的瞬间打开了论坛
启动时的动画效果也做好了,很简单,1点之后稍微写下过程
先把成品放上来

增加启动时的动画效果,代码都不用改变多少,就改一下AnimateWindow函数的第三个参数就行了
至于位置,对ShowWindow下断,计算器界面出现之前那个,跳走,再跳回来就是了
上传的附件:
2008-11-1 22:32
0
雪    币: 215
活跃值: (90)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
感觉电脑反应迟钝,这样的效果估计以后没人在用计算器了
2008-11-2 20:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
牛B王大哥,很善是什么意思啊?还请多指点
2008-11-3 20:25
0
雪    币: 563
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错啊 支持下
2008-11-3 21:21
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
请问加入的代码的位置有要求吗,可以随便找个地方就行吗
2008-11-3 23:14
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
善是善,一次两次还是能忍忍这速度。。可用多了就。。。
2008-11-3 23:17
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
18
到底能不能运行呢?我没有虚拟机,不能的话,调试一下看看什么原因(^_^)







通常在代码段找的地方,修改之后能保存的都可以
PE头也可以,我就是在PE头找的



呵呵,娱乐而已
2008-11-3 23:28
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
19
不错,不错。
2008-11-4 09:37
0
雪    币: 112
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
不错,学习下
2008-11-4 12:01
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
21
stalker,问你个问题。
你的那篇给程序加密码框的文章
那个DLL中的对话框在哪能修改啊
我怎么找不到啊!
2008-11-5 12:40
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
22
那个对话框是masm32的一个Pre-Built Dialog
意思就是由masm32做好了,提供的接口
如果你想改的话,就自己设计个吧,不难的
2008-11-5 12:47
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
23
我对编程一窍不通,:-)
2008-11-5 12:53
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
24
建议写一个有界面的DLL
帮助我们这些编程菜鸟
(*^__^*) 嘻嘻……
2008-11-5 13:14
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
25
呵呵,用别人的东西始终不是长久之计
学习编程吧,不难的
2008-11-5 13:25
0
游客
登录 | 注册 方可回帖
返回
//