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. SVD小结

    1.矩阵分解 假设一个矩阵Data是m行n列,SVD(奇异值分解)将Data分解为U,E,VT 三个矩阵: Datam*n=Um*kEk*kVTk*n E是一个对角矩阵,对角元素为奇异值,对应Data ...

  2. Mark一下,一上午就这么过去了,关于客户端连接oracle10G的问题

    Mark一下,一上午就这么过去了,关于客户端连接oracle10G的问题 正常的客户端PLSQL和Navicat都可以正常连接Oracle(局域网内),但代码生成器和VS2015死活连不上,在网上找了 ...

  3. reverse-XNUCA-babyfuscator

    上一次线上赛的一道题目 链接:http://pan.baidu.com/s/1qY9ztKC 密码:xlr2 这是一道代码混淆的题目,因为当时还不知道angr这样一个软件,所以我就用了自己的一种思路 ...

  4. 在线工具、setHtmlRem、px2rem

    http://tool.lu/c/developer  开发类在线工具 https://github.com/leon776/setHtmlRem   setHtmlRem https://githu ...

  5. Thrift 个人实战--Thrift 网络服务模型

    前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...

  6. [debian]SublimeText>PrettyCode無效

    怣 apt-get install node http://nodejs.org/#download.

  7. import tf

    不知道为什么,tensorflow要最后import,否则会对matplotlib的imread产生影响,产生IO错误,异常莫名其妙

  8. Word 2013发布博客配置步骤

    .打开Word 2013,点击"共享"››"博客":   .在打开的窗口中点击"管理帐户":   .然后点击"新建": ...

  9. Array函数

    array_flip()例子 , , "c" );$trans = array_flip($trans);print_r($trans);?> 答案: Array ( [1] ...

  10. JavaScript学习中的挑战

    当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战: 有些概念容易混淆,特别是当你学习过其他语言的时候.很难找到学习的时间(有时候是动力).一旦当你理解了一些东西的 ...