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. php-数据库访问--增、删、改

    建立一个登录页面 <form action="chuli.php" method="post"> <div>用户名:<input ...

  2. js 开启video全屏模式

    方法一: function launchFullScreen() { var element = document.documentElement; if(element.requestFullScr ...

  3. linux系统io的copy

    #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h&g ...

  4. H5版俄罗斯方块(3)---游戏的AI算法

    前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...

  5. H5版俄罗斯方块(4)---火拼对战的雏形

    前言: 勿忘初心, 本系列的目标是实现一款类似QQ"火拼系列"的人机对战版俄罗斯方块. 在完成了基本游戏框架和AI的算法探索后, 让我们来尝试一下人机大战雏形编写. 本系列的文章链 ...

  6. 去掉EditPlus自动备份bak文件

    用EditPlus编辑文件是总是自动生成一个.bak文件. 其实想去掉EditPlus的自动备份也简单,方法如下: 打开菜单栏上的:工具->参数设置->文件 去掉“保存时创建备份文件”前的 ...

  7. 关于 MAXScript 如何剪切文件夹

    MAXScript 中可以对文件进行创建删除复制等操作但是唯独不能删除文件夹... 网上搜了一下批处理的剪切方法,在 MAXScript 里调用一下就好了 fn xcopy oldfile newfi ...

  8. 使用as3控制动画的播放与暂停

    1.需要两个按钮元件 2.在属性面板为两个按钮元件分别命名为pausebutton与playButton 3.代码 stop(); pausebutton.visible = false; playB ...

  9. each循环

    var NA_COUNT=0; var NG_OK_COUNT=0; //获取所有检验明细为同一个编号的下拉选项,看有没有不是N/A的下拉选项 $("#@(Perfix)tbData sel ...

  10. 用java语言实现事件委托模式

    http://blog.csdn.net/yanshujun/article/details/6494447 用java语言实现事件委托模式 2010-04-27 00:04 2206人阅读 评论(1 ...