能力值:
( LV12,RANK:530 )
|
-
-
2 楼
1.程序运行不了,看了一下
发现:VOffset=7479,把它改成4000就可以了,为什么不是5000?因为SizeOfimage也就是5000而已
2,增加一个Register,用资源黑客最省事了:
10000 MENUEX
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
{
POPUP "&File", 0, MFT_STRING, MFS_ENABLED, 0
{
MENUITEM "E&xit", 10001, MFT_STRING, MFS_ENABLED
}
POPUP "&Help", 0, MFT_STRING, MFS_ENABLED, 0
{
MENUITEM "&About", 10101, MFT_STRING, MFS_ENABLED
MENUITEM "&Register", 10102, MFT_STRING, MFS_ENABLED //增加这一行
}
}
3.另Register菜单与Register按妞起相同的作用~!
原来的代码如下:
00401167 |. 8B45 10 mov eax, dword ptr [ebp+10] ; Case 111 (WM_COMMAND) of switch 004010FA
0040116A |. 25 FFFF0000 and eax, 0FFFF
0040116F |. 3D 11270000 cmp eax, 2711 ; //是不是exit菜单
00401174 |. 75 13 jnz short 00401189 //不是跳走,是就发送关闭消息!
00401176 |. 6A 00 push 0 ; /lParam = 0; Case 2711 of switch 0040116F
00401178 |. 6A 00 push 0 ; |wParam = 0
0040117A |. 6A 10 push 10 ; |Message = WM_CLOSE
0040117C |. FF75 08 push dword ptr [ebp+8] ; |hWnd
0040117F |. E8 6C020000 call <jmp.&user32.SendMessageA> ; \SendMessageA
00401184 |. E9 9F000000 jmp 00401228
00401189 |> 3D E9030000 cmp eax, 3E9 //比较是不是按下了Risgeter
0040118E |. 75 41 jnz short 004011D1 //不是跳走
00401190 |. 6A 00 push 0 ; /lParam = NULL; Case 3E9 of switch 0040116F
00401192 |. 68 2E124000 push 0040122E ; |DlgProc = ty123_Re.0040122E
00401197 |. FF35 34304000 push dword ptr [403034] ; |hOwner = NULL
0040119D |. 68 D0070000 push 7D0 ; |pTemplate = 7D0
004011A2 |. FF35 2C304000 push dword ptr [40302C] ; |hInst = NULL
004011A8 |. E8 F5010000 call <jmp.&user32.DialogBoxParamA> ; \DialogBoxParamA,显示注册对话框
修改后如下:
0040116F /E9 F3020000 jmp 00401467 跳到我们的代码处!
00401467 3D 76270000 cmp eax, 2776 //比较是不是菜单
0040146C 75 05 jnz short 00401473 //不是跳到比较是不是按妞
0040146E ^ E9 1DFDFFFF jmp 00401190 //是就跳到显示注册对话匡
00401473 3D 11270000 cmp eax, 2711 //比较是不是按妞
00401478 ^ E9 F7FCFFFF jmp 00401174 //跳回原来代码处
4。现在Register菜单与Register按妞起相同的作用了,但是点击以后只有按妞变灰,但是菜单没有,还得修改代码!
灰化完按妞之后继续灰化菜单,这样就达到要求了~~
00401152 . /E9 28030000 jmp 0040147F //条到我们的代码处
0040147F E8 2AFFFFFF call <jmp.&user32.EnableWindow>
.............
jmp 原来代码处
=============最后一步取得菜单句柄的函数不大熟悉,等高手答案====
|
能力值:
( LV12,RANK:740 )
|
-
-
3 楼
还可以动态的添加菜单:
00401124 |. A3 40304000 MOV DWORD PTR DS:[403040],EAX
改成下面这样,让它跳到我们的代码:
00401124 E9 77030000 JMP ty123_Re.004014A0
:::
004014A0 > A3 40304000 MOV DWORD PTR DS:[403040],EAX
004014A5 . 90 NOP
004014A6 . 6A 01 PUSH 1 ; /Pos = 1
004014A8 . 50 PUSH EAX ; |hMenu
004014A9 . E8 AC209277 CALL user32.GetSubMenu ; \GetSubMenu
004014AE . 68 C5144000 PUSH ty123_Re.004014C5 ; /pItem = "&Register"
004014B3 . 68 E9030000 PUSH 3E9 ; |ItemID = 3E9 (1001.)
004014B8 . 6A 00 PUSH 0 ; |Flags = MF_BYCOMMAND|MF_ENABLED|MF_STRING
004014BA . 50 PUSH EAX ; |hMenu
004014BB . E8 AC5C9277 CALL user32.AppendMenuA ; \AppendMenuA
004014C0 .^E9 64FCFFFF JMP ty123_Re.00401129
004014C5 . 26 52 65 67 69>ASCII "&Register",0
因为ty123根据消息提供的ID直接跳到相应的处理程序,所以将新菜单的ID直接设置为和“注册”按钮的ID一样,它们就会有相同的功能了。
下面是菜单变灰的部分:
040114C . FF35 3C304000 PUSH DWORD PTR DS:[40303C] ; |hWnd = NULL
改为=>
0040114C E9 7F030000 JMP ty123_Re.004014D0
00401151 90 NOP
:::004014D0:::
004014D0 > FF35 3C304000 PUSH DWORD PTR DS:[40303C] ; |hWnd = NULL
004014D6 . E8 F9AF9177 CALL user32.EnableWindow ; \EnableWindow
004014DB . 6A 01 PUSH 1 ; /Pos = 1
004014DD . FF35 40304000 PUSH DWORD PTR DS:[403040] ; |hMenu = NULL
004014E3 . E8 72209277 CALL user32.GetSubMenu ; \GetSubMenu
004014E8 . 6A 01 PUSH 1 ; /Flags = MF_BYCOMMAND|MF_GRAYED|MF_STRING
004014EA . 68 E9030000 PUSH 3E9 ; |ItemID = 3E9 (1001.)
004014EF . 50 PUSH EAX ; |hMenu
004014F0 . E8 47E79177 CALL user32.EnableMenuItem ; \EnableMenuItem
004014F5 .^E9 5DFCFFFF JMP ty123_Re.00401157
|
能力值:
( LV12,RANK:530 )
|
-
-
4 楼
因为ty123根据消息提供的ID直接跳到相应的处理程序,所以将新菜单的ID直接设置为和“注册”按钮的ID一样,它们就会有相同的功能了。 ........
这个我事后才想到
原来是EnableMenuItem函数....
========由 小娃崽 于 2007-02-14 20:22 最后编辑=====
楼上的直接在代码里面call函数,估计不通用,看来ty123的目的是想叫我们自己添加...
|