设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3093|回复: 5
打印 上一主题 下一主题

[原创发布] AVG用,为RM添加系统菜单

 关闭 [复制链接]

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

跳转到指定楼层
1
发表于 2009-11-29 22:16:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 神思 于 2009-11-29 22:44 编辑

更新一下..!!!!!
请重新下载

-___-|||........
最经一直在研究VC....

在VX环境下.重载WNDPROC会出问题。。
所以...截取菜单消息也无能了....

Menu.JPG (48.27 KB, 下载次数: 12)

Menu.JPG

Project7.rar

230.04 KB, 下载次数: 590

-.-

Lv1.梦旅人

魔王 ⑨

梦石
0
星屑
90
在线时间
379 小时
注册时间
2006-10-16
帖子
4299

贵宾

2
发表于 2009-11-29 22:21:58 | 只看该作者
哟,真是有趣的东西,改写了RGSSPlayer?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

巫女会长

梦石
0
星屑
60
在线时间
1028 小时
注册时间
2009-10-24
帖子
3470

贵宾

3
发表于 2009-11-29 22:24:23 | 只看该作者
有相当大的发展空间....
回复 支持 反对

使用道具 举报

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

4
 楼主| 发表于 2009-11-29 22:26:53 | 只看该作者
不是...
-___-今天发现动态连接库里能放MENU...
-_______-然后又发现又SetMenu这玩意...
然后又然后..前几天写了个重载窗口过程函数的东西.....发现有的搞...

不过有点很奇怪的..
就是F2跟全屏的消息都是0x0111= =|||...
菜单的消息都是0x0111
-.-
回复 支持 反对

使用道具 举报

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

5
 楼主| 发表于 2009-11-29 22:35:44 | 只看该作者
发现那范例有个问题..

作者信息的ID是40006.
-____-但RM里匹配的是40005..需要自己手动改一下..

还有..必须要把截取WM_ACTIVATEAPP消息的那段代码注释掉....

-_______-|||哎..我还是更新一下好了..
-.-
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
6
发表于 2009-11-30 02:50:23 | 只看该作者
MSDN 关于 SetWindowLong 有如下一段:
Calling SetWindowLong with the GWL_WNDPROC index creates a subclass of the window class used to create the window. An application can subclass a system class, but should not subclass a window class created by another process. The SetWindowLong function creates the window subclass by changing the window procedure associated with a particular window class, causing the system to call the new window procedure instead of the previous one. An application must pass any messages not processed by the new window procedure to the previous window procedure by calling CallWindowProc. This allows the application to create a chain of window procedures.


而关于 CallWindowProc 有如下一段:
lpPrevWndFunc [in] Pointer to the previous window procedure. If this value is obtained by calling the GetWindowLong function with the nIndex parameter set to GWL_WNDPROC or DWL_DLGPROC, it is actually either the address of a window or dialog box procedure, or a special internal value meaningful only to CallWindowProc.


所以正确做法应该是调用 CallWindowProc,这样 VX 也能替换窗口过程了~(不过替换之后通过 RGSSEval 解释 VX 脚本的话还会有一些诡异的现象,至今不明原因,神思可以研究下)
或许是在 XP 中,SetWindowLong 返回的刚好是一个函数指针,而在 VX 中返回的就是一个只对 CallWindowProc 有意义的特殊值

消息一般分两种,一种是以 WM 开头,但并非 WM_COMMAND 的消息,这类消息是标准消息;0x0111 即 WM_COMMAND,这个消息可以表示两种消息,一种是命令消息,一种是通告消息
命令消息来自菜单、加速键和各种按钮,虽然消息都是 WM_COMMAND ,但可以通过菜单、加速键或者工具栏按钮的一个唯一的标识来区分;后者是由控件发送的,作用一般是通知父窗口某个事件的发生,但仅仅是通知,并不是让父窗口来处理这个消息,因为处理这个消息的应该是子窗口,即控件本身

这里 SetMenu 之后的就是窗口的菜单,每个菜单项都有一个唯一的标识,当系统从消息队列中获取到 WM_COMMAND 后,会把这个标示传递给 wParam,然后一并传递给窗口过程函数处理
这个标识是在调用 AppendMenu 时传递给 uIDNewItem 参数的一个 UINT,或者是 InsertMenuItem 时传递给第二个 uItem 参数的一个 UINT
F2 和全屏都属于加速键,所以都是 WM_COMMAND~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-16 05:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表