易语言消息钩子截获外部窗口消息DLL制作

消息钩子回调函数

.版本 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.wParam1)
        ' 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, , , 消息被传递时光标在屏幕上的位置

511遇见易语言DLL制作调用及hook注入

资源教程交流①群:521068947


发布日期:

所属分类: 易语言 标签: