易语言hOOk系统顶级窗口的创建销毁切换

ShellHook是什么?当一个窗口创建、激活、关闭时,explorer总是能够捕获相应的消息,并更新任务栏上,就是通过ShellHook实现的。本课实现了对系统所有顶级窗口的拦截,和指定窗口的拦截。

RegisterWindowMessage

RegisterWindowMessage函数定义一个新的窗口消息,保证该消息在系统范围内是唯一的。通常调用SendMessage或者PostMessage函数时,可以使用该函数返回的消息值。

注释:

RegisterWindowMessage函数通常用于为两个合作应用程序之间的通信登记消息。  若两个不同的应用程序登记了相同的消息字符串,则这两个应用程序返回相同的消息值。该消息一直维持被登记状态,直到Windows会话结束。当多个应用程序必须处理同一消息时才使用RegisterWindowMessage函数。在一个窗口类范围内发送私有消息时,获取分配给一个字串标识符的消息编号 &C000(49152) 到 &FFFF(65535)之间的一个消息编号。零意味着出错。

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-registerwindowmessagea

字符串常见有:
TaskBarCreated 一般用于Explorer崩溃后的托盘图标重建
SHELLHOOK 配合RegisterShellHookWindow可用于拦截系统窗口创建等
TaskbarButtonCreated 在win7里的任务按钮创建

RegisterShellHookWindow

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-registershellhookwindow

开始拦截

.版本 2
 
.子程序 开始拦截
 
MsgNum = RegisterWindowMessage (“SHELLHOOK”)
.如果真 (MsgNum = 0)
    信息框 (“注册shell hook 失败”, 0, , )
    返回 ()
 
.如果真结束
RegisterShellHookWindow (取窗口句柄 ())
' 窗口子类化
SetRet = SetWindowLong (取窗口句柄 (), -4, 到整数 (&NewProc))

窗口子类化

 

.版本 2
.支持库 iext
 
.子程序 NewProc, 整数型
.参数 Hwnd, , , 这个句柄是程序本身的句柄
.参数 uMsg, , , 用户的消息识别类型
.参数 wParam, , , 事件类别
.参数 lParam, , , 拦截的系统的窗口 的句柄
.局部变量 Tid
.局部变量 i
 
' 只针对某一个特定顶级窗口hook
.如果真 (lParam = 取指定窗口句柄 (“无标题 - 记事本”))
    .判断开始 (wParam = 1)  ' 顶级窗口的创建’
        GetWindowThreadProcessId (lParam, Tid)
        .如果真 (Tid ≠ 0)
            i = 超级列表框1.插入表项 (, “窗口创建”, , , , )
            超级列表框1.置标题 (i, 1, 到文本 (lParam))
            超级列表框1.置标题 (i, 2, 到文本 (Tid))
            超级列表框1.置标题 (i, 3, 到文本 (取指定窗口标题 (lParam)))
            超级列表框1.保证显示 (i)
 
        .如果真结束
 
    .判断 (wParam = 2)  ' 顶级窗口的销毁’
        GetWindowThreadProcessId (lParam, Tid)
        .如果真 (Tid ≠ 0)
            i = 超级列表框1.插入表项 (, “窗口销毁”, , , , )
            超级列表框1.置标题 (i, 1, 到文本 (lParam))
            超级列表框1.置标题 (i, 2, 到文本 (Tid))
            超级列表框1.置标题 (i, 3, 到文本 (取指定窗口标题 (lParam)))
            超级列表框1.保证显示 (i)
 
        .如果真结束
 
    .判断 (wParam = 32772)  ' 顶级窗口切换
        GetWindowThreadProcessId (lParam, Tid)
        .如果真 (Tid ≠ 0)
            i = 超级列表框1.插入表项 (, “窗口切换”, , , , )
            超级列表框1.置标题 (i, 1, 到文本 (lParam))
            超级列表框1.置标题 (i, 2, 到文本 (Tid))
            超级列表框1.置标题 (i, 3, 到文本 (取指定窗口标题 (lParam)))
            超级列表框1.保证显示 (i)
 
        .如果真结束
 
    .默认
    .判断结束
.如果真结束
返回 (CallWindowProc (SetRet, Hwnd, uMsg, wParam, lParam))

 

文章来源:511遇见不一样的遇见

原文链接:http://www.511yj.com/eyuyan-hook-shellhook.html

历史上的今天
八月
27
亦行
  • 版权声明 本文源自 511遇见 整理 发表于 2019-08-2722:23:35
WindowsAPI易语言内介绍和使用 技术分享

WindowsAPI易语言内介绍和使用

引用百度百科介绍:Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到...
了解和掌握易语言面向对象 技术分享

了解和掌握易语言面向对象

许久许久,忙于工作和结婚无法更新一些实用的技术文章,趁女神节有点业余时间写下这篇“面向对象”技术分享文章 前言  希望你在看完这篇文章后能够了解 面向对象的含义,了解什么是面向对象 知道什么是类,了解...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: