消息截获

#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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,908评论 18 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,510评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,237评论 25 708
  • 我一直都认为自己是一个不安分的人,并且有比较严重的自虐倾向。但凡能舒服几天,绝对会主动的给自己找点不痛快。不爱轻易...
    囡囡601阅读 175评论 0 1
  • 美丽的秋姑娘来了。 她来到蓝蓝的天上。看,那红彤彤的太阳是秋姑娘的笑脸,那洁白的云朵是秋姑娘头...
    金指尖的花园阅读 513评论 0 4