易语言通过消息全局钩子截获外部窗口消息

开始截获

.版本 2
 
.子程序 开始截获, 逻辑型
.参数 窗口句柄
.局部变量 hmod, 整数型
.局部变量 lpProc, 子程序指针
.局部变量 ThreadID, 整数型
.局部变量 hHook, 整数型
 
.如果真 (窗口句柄 = 0)
    返回 ()
.如果真结束
.如果真 (GetPropA (窗口句柄, #prop)0)
    ' 不等于0说明已经加载过钩子了
    返回 (假)
.如果真结束
' 第一步  获取 Hookdll的 句柄
hmod = LoadLibraryA (取运行目录 () + “\msghook.dll”)
' 第二步  获取GetMsgProc 这个回调函数的 指针
lpProc = GetProcAddress (hmod, “GetMsgProc”)
' 第三部 获取截获窗口的线程ID
ThreadID = GetWindowThreadProcessId (窗口句柄, 0)
' 给指定的窗口安装消息钩子,该窗口在收到postMessage的消息后会自动加载钩子函数所在的DLLmsghook.dll
hHook = SetWindowsHookExA (#WH_GETMESSAGE, lpProc, hmod, ThreadID)
' 释放dll
FreeLibrary (hmod)
' 开始给窗口发送消息,通知msghook.dll子类化窗口过程,并传递钩子句柄过去
PostMessageA (窗口句柄, #MyMsgClass, 1, hHook)
返回 (hHook ≠ 0)

结束截获

.版本 2
 
.子程序 结束截获, 逻辑型
.参数 窗口句柄, 整数型
.局部变量 hHOOK, 整数型
 
.如果 (窗口句柄 = 0)
    返回 ()
.否则
 
.如果结束
' 取回钩子的句柄
hHOOK = SendMessageA (窗口句柄, #MyMsgClassHook, 0, 0)
.如果真 (hHOOK = 0)
    ' 0说明窗口已经关闭了
    返回 ()
.如果真结束
' 通知窗口截获结束,恢复窗口过程
SendMessageA (窗口句柄, #MyMsgClass, 0, 0)
返回 (UnhookWindowsHookEx (hHOOK))

主程序调用开始截获

.版本 2

.程序集 窗口程序集_启动窗口

.子程序 _按钮1_被单击
.局部变量 hwnd

hwnd = 取指定窗口句柄 (“无标题 - 记事本”)
.如果真 (hwnd = 0)
信息框 (“请打开一个空白记事本”, 0, , )
返回 ()

.如果真结束
.如果真 (开始截获 (hwnd))
信息框 (“开始截获消息”, 0, , “成功”)
.如果真结束

.子程序 _按钮2_被单击
结束截获 (取指定窗口句柄 (“无标题 - 记事本”))
.子程序 取指定窗口句柄, 整数型
.参数 窗口标题, 文本型
返回 (FindWindowA (字符 (0), 窗口标题))
.子程序 __启动窗口_将被销毁

结束截获 (取指定窗口句柄 (“无标题 - 记事本”))


发布日期:

所属分类: 易语言 标签: