body
{
font-family: Bitstream Vera Sans Mono;
font-size: 11pt;
line-height: 1.5;
}
html, body
{
color: #000000;
background-color: #C2E7C7;
}
h1 {
font-size:1.5em;
font-weight:bold;
}
h2 {
font-size:1.4em;
font-weight:bold;
}
h3 {
font-size:1.3em;
font-weight:bold;
}
h4 {
font-size:1.2em;
font-weight:bold;
}
h5 {
font-size:1.1em;
font-weight:bold;
}
h6 {
font-size:1.0em;
font-weight:bold;
}
img {
border:0;
max-width: 100%;
}
blockquote {
margin-top:0px;
margin-bottom:0px;
}
table {
border-collapse:collapse;
border:1px solid #bbbbbb;
}
td {
border-collapse:collapse;
border:1px solid #bbbbbb;
}

窗口 超类化 子类化 HOOK

#include "StdAfx.h"
#include "MyGameWnd.h"
#include <strsafe.h>
WNDPROC g_pSubclassOldProc ;   // 保存窗口默认的消息响应函数指针
WNDPROC g_pSuperOldProc ;// 保存窗口默认消息处理函数
HWND g_hMySuperWnd = NULL;
HWND g_hMySubWnd = NULL;
// 用于替换子类化窗口的消息响应函数
LRESULT CALLBACK MyProcSubClass( HWND hWnd , UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message )
    {
    case WM_CHAR :
        {
            :: MessageBox(hWnd , "WM_CHAR响应", "子类化" , MB_OK);
            return 0;
        }
    case WM_USERMESSAGE :
        OutputDebugStringA("自定义消息响应" );
        :: MessageBox(hWnd , "自定义消息响应", "子类化" , MB_OK);
        break;
    default: return ::CallWindowProc( g_pSubclassOldProc, hWnd , message, wParam , lParam);
    }
}
// 对创建好的窗体进行子类化代码
void creat_my_sub_wnd (HINSTANCE hInstance,HWND hWnd, int nCmdShow)
{
    // 创建
    g_hMySubWnd = CreateWindowEx (NULL, "EDIT", "MyGameSubClassWnd" ,WS_CHILD, 0,0, 0, 0, hWnd, NULL , hInstance, NULL);//注意此处的EDIT必须是现有的 窗口类型名称,不能是随便的值
    if (g_hMySubWnd == NULL)
    {
//         char buf[100] = {0};
//         sprintf(buf,"%x",GetLastError());
//         OutputDebugStringA(buf);
    }
    g_pSubclassOldProc = (WNDPROC )::SetWindowLong( g_hMySubWnd, GWL_WNDPROC, (DWORD )MyProcSubClass);
    // 显示
    // ShowWindow(hMyWnd, nCmdShow);
    UpdateWindow(hWnd );
    :: PostMessage(g_hMySubWnd ,WM_USERMESSAGE, NULL,NULL );
}
// 用于替换的超类化消息响应函数
LRESULT CALLBACK my_super_wnd_proc( HWND hWnd , UINT message, WPARAM wParam , LPARAM lParam)
{
    switch(message )
    {
    case WM_CHAR :
        {
            :: MessageBox(hWnd , "WM_CHAR响应", "超类化" , MB_OK);
            return 0;
        }
    case WM_USERMESSAGE :
        :: MessageBox(hWnd , "自定义消息响应", "超类化" , MB_OK);
        break;
    default:
        return ::CallWindowProc (g_pSuperOldProc, hWnd, message , wParam, lParam );
    }
}
// 创建超类化控件代码
void creat_my_super_wnd (HINSTANCE hInstance,HWND hWnd, int nCmdShow)
{
    // 取得原控件信息
    WNDCLASSEX myeditClass ;
    :: GetClassInfoEx(hInstance , "EDIT", & myeditClass); //注意此处的EDIT必须是现有的 窗口类型名称,不能是随便的值
    // 保存原控件默认消息处理函数
    g_pSuperOldProc = myeditClass .lpfnWndProc;
    // 设置替换的消息处理函数
    myeditClass.lpfnWndProc = my_super_wnd_proc;
    // 指定新的窗口类名字
    myeditClass.lpszClassName = "MyGameSuperClass";
    // 设置结构体大小
    myeditClass.cbSize = sizeof( WNDCLASSEX);
    // 注册新信息
    RegisterClassEx(&myeditClass );
    // 创建
    g_hMySuperWnd = CreateWindowEx (NULL, myeditClass.lpszClassName , "MyGameSuperClassWnd",     WS_CHILD, 0,0, 0, 0, hWnd, NULL , hInstance, NULL);
    if (g_hMySuperWnd == NULL)
    {
        char buf [100] = {0};
        sprintf(buf ,"%x", GetLastError());
        OutputDebugStringA(buf );
    }
    // 显示
    //ShowWindow(hEdit, nCmdShow);
    UpdateWindow(hWnd );
    :: PostMessage(g_hMySuperWnd ,WM_USERMESSAGE, NULL,NULL );
}

窗口 超类化 子类化 HOOK的更多相关文章

  1. 窗口的子类化与超类化——子类化是窗口实例级别的,超类化是在窗口类(WNDCLASS)级别的

    1. 子类化 理论:子类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息.一个应用程序通过截获属于另一个窗口的消息,从而实现增加.监视或者修改那个窗口的缺省行为.子类化是用来改变或者扩展一 ...

  2. 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

    眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...

  3. Win32中安全的子类化(翻译)

    关于子类化的话题虽然有些旧,但它至今仍然不失为一种开发Windows的强有力技术,在MFC的内核.甚至.NET的内核中都离不开它,希望本连载能对Windows开发的爱好者有所帮助. 原文标题:Safe ...

  4. C++ 中超类化和子类化常用API

    在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWi ...

  5. C++ 中超类化和子类化

    超类化和子类化没有具体的代码,其实是一种编程技巧,在MFC和WTL中可以有不同的实现方法. 窗口子类化: 原理就是改变一个已创建窗口类的窗口过程函数.通过截获已创建窗口的消息,从而实现监视或修改已创建 ...

  6. 从以往子类化跟踪MouseLeave深入讨论VB6的自定义Hook类

    一.关于起因 之前发过一篇博文,是关于VB6中跟踪鼠标移出事件的示例(http://www.cnblogs.com/alexywt/p/5891827.html) 随着业务状况的不断发展,提出了更多的 ...

  7. Ring3下无驱动移除winlogon.exe进程ctrl+alt+del,win+u,win+l三个系统热键,非屏蔽热键(子类化SAS 窗口)

    随手而作,纯粹技术研究,没什么实际意义. 打开xuetr,正常情况下.winlogon.exe注册了三个热键.ctrl+alt+del,win+u,win+l三个. 这三个键用SetWindowsHo ...

  8. 深入理解MFC子类化

    子类化,通俗来讲就是用自己的窗口处理函数来处理特定消息,并将自己其他消息还给标准(默认)窗口处理函数.在SDK中,通过SetWindowLong来指定一个自定义窗口处理函数:SetWindowLong ...

  9. 走出MFC子类化的迷宫

    走出MFC子类化的迷宫 KEY WORDS:子类化 SUBCLASSWINDOW  MFC消息机制 许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习 ...

随机推荐

  1. HttpContext.Current.Cache 和HttpRuntime.Cache的区别

    先看MSDN上的解释:      HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象.      HttpRuntime.Cache:获取当前应用程序的Cac ...

  2. Pylot压力测试(linux)

    Pylot需要python2.5以上的版本,打开以后选择对应你的系统的版本,下载好之后双击安装. centOS5.5 系统版本python版本是2.4.3,所以要下载个2.5以上的. 1.下载Pyth ...

  3. python 深拷贝与浅拷贝

    浅拷贝的方式有: lst=[1,2,3] (1)直接赋值: lst_cp = lst (2)for循环遍历生成:lst_cp= [i for i in lst] (3)copy模块下,copy.cop ...

  4. LA 4329 ping-pong树状数组

    题目链接: 刘汝佳,大白书,P197. 枚举裁判的位置,当裁判为i时,可以有多少种选法,如果已经知道在位置i之前有ci个数比ai小,那么在位置i之前就有i-1-ci个数比ai大. 在位置i之后有di个 ...

  5. Xerces链接错误原因之/Zc:wchar_t-设置不一致

    今天程序需要使用Xerces作为xml文件的解析与序列化工具,使用的是Xerces2.7.0版本.具体编译教程如下: 成功编译出了Xerces.dll和Xerces.lib.但是在链接到主工程的时候, ...

  6. MongoDB学习笔记一:入门

    文档:多个键及其关联的值『有序』地放置在一起. {"greeting" : "Hello, world!", "foo" : 3}集合:一组 ...

  7. JVM byte code

    http://blog.jamesdbloom.com/JVMInternals.html#constant_pool http://grepcode.com/file/repository.grep ...

  8. Appium自动化时,如何快速获得Android app的包名和启动页

    在app自动化的时候,经常被问道如何知道app的包名和启动页名称.这个问题很简单: 1. 最直接的方式,去问开发啊,他们告诉你app的包名和启动页. 2. 如果你比较腼腆,又能看到/懂代码,自己把代码 ...

  9. CentOS6.8 MySQL 5.6实现主从复制

    主库操作 1.将mysqldump命令添加到/usr/bin中 ln -s /application/mysql/bin/mysqldump /usr/bin/ 2.开启master上的log-bin ...

  10. CompositeConfiguration的用法

    public class Mytest { private static ApplicationContext applicationContext; public static void main( ...