赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
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~ |
|