美文网首页
消息截获

消息截获

作者: bluewind1230 | 来源:发表于2018-02-02 19:02 被阅读0次
#include <windows.h>
#include "resource.h"
INT_PTR CALLBACK MainProc(
    _In_ HWND   hwndDlg,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
);

INT_PTR CALLBACK BtnProc(
    _In_ HWND   hwndDlg,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
);

WNDPROC g_oldProc = nullptr;

INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, MainProc);
    return 0;
}
INT_PTR CALLBACK MainProc(
    _In_ HWND   hwndDlg,
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    switch (uMsg)
    {
    case WM_CLOSE:
        EndDialog(hwndDlg, 0);
        break;
    case WM_COMMAND:
    {
        WORD wID = LOWORD(wParam);
        if (wID == IDC_BUTTON1)
        {
            MessageBox(hwndDlg, TEXT("你在父窗口中点击了我!"), 0, MB_YESNO);
            /*下面的代码可以写在任何地方*/
            //1 改变按钮1的消息处理函数,变成我的
            HWND hBtn1 = GetDlgItem(hwndDlg, IDC_BUTTON1);
            // 函数返回原来的信息
            g_oldProc = (WNDPROC)SetWindowLong(hBtn1, GWL_WNDPROC, (LONG)BtnProc);//这个函数很重要
                                                            //将控件的回调函数替换成BtnProc,就是说下面再继续执行操作的话
                                                        //那么回掉函数将不会是原来的,原来的回掉函数被g_oldProc所记录,取而代之的将是一个新的回掉函数,它就是BtnProc
                                                          //原来的回调函数被g_oldProc所记录
        }
    }
        break;
    default:
        break;
    }
    return 0;
}

INT_PTR CALLBACK BtnProc(
    _In_ HWND   hwndDlg,// 按钮的
    _In_ UINT   uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    switch (uMsg)
    {
    case WM_LBUTTONDOWN:
    {
        MessageBox(hwndDlg, TEXT("你在自己的回调函数里被处理了!"), 0, MB_YESNO);
        (WNDPROC)SetWindowLong(hwndDlg, GWL_WNDPROC, (LONG)g_oldProc);//新的消息回调函数获取消息以后
                                                                    // 继续把消息抛给g_oldProc所保存的原来的
                                                                    //消息回调函数
        g_oldProc = nullptr;//这是一个编程习惯,将指针设定为空
        return 1;
    }
        break;
    default:
        break;
    }
    return g_oldProc(hwndDlg,uMsg,wParam,lParam);
}

SetWindowLong说明:

g_oldProc = (WNDPROC)SetWindowLong(hBtn1, GWL_WNDPROC, (LONG)BtnProc);//这个函数很重要
                                                            //将控件的回调函数替换成BtnProc,就是说下面再继续执行操作的话
                                                        //那么回掉函数将不会是原来的,原来的回掉函数被g_oldProc所记录,取而代之的将是一个新的回掉函数,它就是BtnProc
                                                          //原来的回调函数被g_oldProc所记录
        }
SetWindowLong原型;
Long SetWindowLong (
HWND hWnd ,      //窗口句柄,将要截获的那个控件的ID
int nIndex,          //索引,它是一个宏,可以指,消息处理函数,窗口ID,这里如果是GWL_WNDPROC的话,下面一个参数将是新的回掉函数
LONG dwNewLong    //一般指的是新的回掉函数
)

nIndex的值:
GWL_EXSTYLE ----> 扩展风格
GWL_STYLE ------>风格
GWL_WNDPROC----->消息处理函数
GWL_HINSTANCE---->实例
GWL_ID----------->窗口ID

相关文章

  • 消息截获

    SetWindowLong说明: nIndex的值:GWL_EXSTYLE ----> ...

  • MFC消息截获之pretranslatemessage

    前几天,查了一个batch的问题,问题大致是这样,父窗口消息一个鼠标消息,弹出一个模态框,CPU负荷就飚升到100...

  • iOS知识整理-Block

    Block是将函数及其执行上下文封装起来的对象 变量截获 局部变量截获 是值截获 〜局部静态变量截获 是指针截获 ...

  • iOS Block面试题(Block变量截获)

    Block变量截获 1、局部变量截获 是值截获。 比如: 这里的输出是6而不是2,原因就是对局部变量num的截获是...

  • 漫画:什么是DES算法

    网络传输经常采用http的方式,假设一个发送方向接收方发送消息,如果没有任何加密算法。那么消息在被中间人截获到之后...

  • Https的密码学基础

    三个主角 (1)卡尔(与冰女进行消息往来) (2)拉比克(截获卡尔和冰女传递的消息,也就是中间人) (3)冰女(与...

  • Block截获对象的内存思考

    在讨论Block截获对象的内存变化前。先看一下Block截获对象时,截获的是什么。 下面举个例子 这样看不够直观,...

  • Objective-C Runtime(二): 实践 监测与防护

    上篇文章 介绍了一些runtime的基础知识, 这次分享一些runtime的各种黑科技玩法: 消息转发截获, is...

  • OC block基本操作--解除引用循环

    block截获self情况. 略. block截获成员变量时,避免循环引用的几种基本操作. 下面这段代码如果不做任...

  • Fiddler 4 的常规使用- Windows

    Fiddler 不但能截获各种浏览器发出的 HTTP 请求, 也可以截获各种智能手机发出的 HTTP/HTTPS ...

网友评论

      本文标题:消息截获

      本文链接:https://www.haomeiwen.com/subject/fwwezxtx.html