本帖最后由 月光下の魔术师 于 2015-2-25 14:23 编辑
第二步,解压文件(就是个.e文件),打开,可以看到具体需要的子程序的作用我都写在备注里面了
第三步,展开_ODBG_Plugindata子程序
,更改“插件名”为你自己的插件名。
Q:什么是插件名?
A:用SOD举例啥叫插件名,看清楚我箭头指的地方,没错是箭头不是鼠标,截图的时候失误了……懂插件名是啥了吧?不懂劳驾楼下回复,不回复我也不强迫你,到时候别喷我说我讲的乱七八糟人家都看不懂就行。
第四步,看_ODBG_Pluginmenu子程序,
,更改标题栏菜单和右键菜单。
Q:那道“|”是干什么用的?
A:看到我剪头指的那道横线了吗?啥,你没看到?不好意思,麻烦你先关掉电脑,换个显示屏配副眼镜再来继续,哦卧槽给你一包辣条别动手。那个|的作用如图所示,就是那道线,可以代替逗号,当然我觉着如果不是闲着无聊的话没必要一溜|下去……
Q: 判断 (origin = #PM_MAIN) 与 判断 (origin = #PM_DISASM) 有何作用?
A: 判断 (origin = #PM_MAIN) 的意思是判断这个插件是不是被在标题栏调用, 判断 (origin = #PM_DISASM) 的意思是判断这个插件是不是被在右键菜单调用,标题栏调用和右键调用可以有不同的项目,如果你的插件两项菜单都一样可以删掉子菜单2,将
.判断开始 (origin = #PM_MAIN)
API_RtlMoveMemory_拷贝 (data, API_lstrcpyn (标题栏菜单, 标题栏菜单, 0), 取文本长度 (标题栏菜单) + 1)
返回 (1)
.判断 (origin = #PM_DISASM)
API_RtlMoveMemory_拷贝 (data, API_lstrcpyn (右键菜单, 右键菜单, 0), 取文本长度 (右键菜单) + 1)
返回 (1)
.默认
.判断结束
改为
.如果真 (origin = #PM_MAIN 或 origin = #PM_DISASM)
API_RtlMoveMemory_拷贝 (data, API_lstrcpyn (标题栏菜单, 标题栏菜单, 0), 取文本长度 (标题栏菜单) + 1)
返回 (1)
Q:SOD的二级子菜单是怎么做出来的?
A:很简单,只要再用{}就可以了
大括号内的所有子项都会成为括号前子项的二级子项。需要注意的是,
这种写法也是可以通过的,且二级子菜单1可以正常响应事件,因为一级子菜单1尽管ID为0,但因为它的作用是引出二级子菜单1,所以OD并不会为它分配响应事件,ID取多少都无所谓。
Q:你前面讲了这么多,菜单ID到底是什么?
A:菜单ID就是这个插件的某级菜单中某个子项独一无二的标示。就像进程拥有PID,窗口拥有窗口句柄一样,菜单只有拥有自己独一无二的ID,OD才能根据这个ID为菜单确定响应事件,这也是为什么同在一个菜单中ID不能重复的原因(同在一个菜单中指同在标题栏菜单或者同在右键菜单),重复了的话OD就没有办法准确地为它分配响应事件了。
第五步,看_ODBG_Pluginaction子程序
,修改响应事件
Q:代码 如果真 (action = 0) 有什么作用?
A:action代表了被触发的子项的ID,也就是菜单ID,请设置好对应ID的菜单的响应事件,设置方法是在 如果真 (action = 0) 下面(是比较ID的代码下面,不是判断是否是菜单栏调用和右键调用的如果真下面,这里需要注意)继续添加如果真,当然,你也可以连续使用 判断() 子程序,Let you go。
|