钩子实现子类化

本文介绍如何通过定义自己的控件类(如CButtonEx)并利用WH_CALLWNDPROC钩子来实现对CButton控件的子类化。在Windows消息处理过程中,当创建或销毁按钮时,钩子函数会进行相应的子类化和取消子类化操作,以扩展或定制按钮的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用控件过程中,如果我们需要截取控件具有的部分功能,我们可以将其子类化,然后在使用原来控件的基础上调用自定义控件具有的相关功能。

例如一个按钮的例子,在对话框中安置一个按钮,然后自己重新从CButton派生CButtonEx类,在初始化时将控件子类化为自己的派生控件,

然后用SubclassWindow将其子类化。

最后使用在取消子类化,UnSubclassWindow。

下面举例实现用钩子对属于button类名的控件子类化。该例程来自互联网。

实现方法:

1.定义自己的控件类,比如CButtonEx:public CButton,实现自绘。


2.安装WH_CALLWNDPROC钩子

a.定义HHOOK全局变量

HHOOK g_WndProcHook=NULL;

b.CXXAPP ::InitInstance()中安装钩子

g_WndProcHook=SetWindowsHookEx(

        WH_CALLWNDPROC,

        (HOOKPROC)CallWndProc,

        NULL,

        GetCurrentThreadId());

c.CXXAPP::ExitInstance()中删除钩子

UnhookWindowsHookEx(g_WndProcHook);

d.CallWndProc中子类化控件

LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)

{

    if (HC_ACTION==nCode)

    {

        CWPSTRUCT* lpCWPSTRUCT=(CWPSTRUCT*) lParam;

        HWND hWnd=lpCWPSTRUCT->hwnd;

        char szClassName[512];

        ::GetClassName(hWnd,szClassName,512);

        switch (lpCWPSTRUCT->message)

        {

        case WM_CREATE:

            {

                if (strcmp(szClassName,"Button")==0)

                {

                    //在这里开始子类化

                    CButtonEx*pBtn=newCButtonEx();

                    pBtn->SubclassWindow(hWnd);

                }

                break;

            }

        case WM_NCDESTROY:

            {

                //取消子类化
                //pBtn->UnsubclassWindow();

                break;

            }

        default:

            break;

        }

    }

    return CallNextHookEx(g_WndProcHook,nCode,wParam,lParam);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值