本课是消息钩子DLL的编写制作,下一节课是主程序调用,消息钩子WH_GETMESSAGE在易语言中的常量值为3,WH_GETMESSAGE消息钩子可以截获消息,但它仅仅能截获PSOT的消息,要想截获所有的消息,必须对窗口子类化,收到自定义消息的时候,开始窗口子类化,通过SetWindowLongA (msg.hwnd, #GWL_WNDPROC, &NewWnProc)设定一个新的地址,GWL_WNDPROC -4 就是为窗口设定一个新的地址,NewWnProc来实现窗口子类化。
消息钩子回调函数
.版本 2 .程序集 HookMsg .程序集变量 hhook, 整数型 .程序集变量 OldProc, 子程序指针 .子程序 GetMsgProc, 整数型, 公开, 消息回调函数 .参数 code, 整数型 .参数 wparm, 整数型, , 消息类别 .参数 lparm, 整数型, , 指向Msg消息结构体的指针 .局部变量 msg, MSG .局部变量 classl, 逻辑型 .如果真 (code < 0) 返回 (CallNextHookEx (hhook, code, wparm, lparm)) .如果真结束 CopyMemory_MSG (msg, lparm, 28) .如果真 (msg.message = #MyMsgClass 且 wparm = #PM_REMOVE 且 取反 (classl)) .判断开始 (msg.wParam = 1) ' WH_GETMESSAGE消息钩子可以截获消息,但它仅仅能截获PSOT的消息 ' 要想截获所有的消息,必须对窗口子类化 ' 收到自定义消息的时候,开始窗口子类化 ' GWL_WNDPROC -4 就是为窗口设定一个新的地址 OldProc = SetWindowLongA (msg.hwnd, #GWL_WNDPROC, &NewWnProc) ' 保存钩子句柄 hhook = msg.hwnd ' 防止窗口子类化重复 classl = 真 .默认 .判断结束 .如果真结束 classl = 假 返回 (CallNextHookEx (hhook, code, wparm, lparm))
窗口子类化
.版本 2 .子程序 NewWnProc, 整数型 .参数 hwnd, 整数型, , 窗口句柄 .参数 umsg, 整数型, , 用户消息类型 .参数 wparm, 整数型 .参数 lparm, 整数型 ' 截获代码 ' 161就是鼠标在非客户区移动时发送给这个窗口 .如果真 (umsg = 161) 信息框 (“非客户区点击了鼠标左键,被截获成功!!”, #信息图标, “易语言截获了修改了消息”, ) .如果真结束 ' 还原 .判断开始 (umsg = #WM_DESTROY 或 umsg = #MyMsgClass 且 wparm = 0) SetWindowLongA (hwnd, #GWL_WNDPROC, OldProc) .判断 (umsg = #MyMsgClassHook) 信息框 (hhook, 0, , ) 返回 (hhook) .默认 .判断结束 返回 (CallWindowProcA (OldProc, hwnd, umsg, wparm, lparm))
常量值表
.版本 2 .常量 WH_GETMESSAGE, "3", , 消息钩子 .常量 MyMsgClass, "52888" .常量 MyMsgClassHook, "52999" .常量 PM_REMOVE, "1", , 消息从队列里除掉。 .常量 GWL_WNDPROC, "-4", , 得到窗口回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用 .常量 WM_DESTROY, "2", , 一个窗口被销毁 .常量 WM_CLOSE, "16", , Reference Source https://referencesource.microsoft.com/
自定义数据类型
.版本 2 .数据类型 POINT .成员 ptX, 整数型 .成员 ptY, 整数型 .数据类型 MSG, , 消息结构体 .成员 hwnd, 整数型, , , 窗口句柄 .成员 message, 整数型, , , 消息的标识符 .成员 wParam, 整数型, , , 附加消息1 .成员 lParam, 整数型, , , 附加消息2 .成员 time, 整数型, , , 消息被传递时候的时间 .成员 pt, POINT, , , 消息被传递时光标在屏幕上的位置
资源教程交流①群:521068947