使用HOOK+SUBCLASSWINDOW写了个DLL,用于PB程序换肤,怎么区分各个控件?我的部分代码如下,只有按钮和编辑控件可以判断出来。因为PB程序的类名和MFC的不一样,很难处理,请各位大牛帮助!
void BeginSubclassing(HWND hWnd)
{
char ClassName[MAX_PATH] = "";
GetClassName(hWnd, ClassName, MAX_PATH );
CWnd *pWnd = CWnd::FromHandle(hWnd); DWORD style; if(strstr(ClassName,"FNWND3")==ClassName || strstr(ClassName,"FNWNS3")==ClassName)//子类化窗口
{
CDlgBase *dlg=new CDlgBase(1);
dlg->SetCustomStyle(true);
dlg->SubclassWindow(hWnd);
}
else if(strcmp(ClassName, "Edit" ) == 0 )//子类化编辑框
{
CCmnEdit *ccmedit=new CCmnEdit();
ccmedit->SubclassWindow(hWnd);
}
else if(strcmp(ClassName, "Button" ) == 0 )
{
style = (UINT)GetWindowLong(hWnd, GWL_STYLE) & 0x0000ffff; if ( style == BS_PUSHBUTTON || style == BS_DEFPUSHBUTTON )//子类化普通命令按钮
{
CCmnButton *cmnbutton=new CCmnButton();
cmnbutton->SubclassWindow(hWnd);
}
else if( style == WS_CHILD | WS_VISIBLE)//子类化静态文本
{
CSkinStatic *skinstatic=new CSkinStatic();
skinstatic->SubclassWindow(hWnd);
}
else if( style == BS_GROUPBOX)//子类化分组框
{

CStaticGrp *staticgrp=new CStaticGrp();
staticgrp->SubclassWindow(hWnd);
}
}}

解决方案 »

  1.   

    我后来改成这样就可以正确识别子控件类型了,呵呵。不知道这样是不是还存在不能唯一标识控件类型。
    else if(strcmp(ClassName, "Button" ) == 0 )
    {
    style = (UINT)GetWindowLong(hWnd, GWL_STYLE) & 0x0000ffff; if ( style == 0x00000000 )//子类化普通命令按钮
    {
    CCmnButton *cmnbutton=new CCmnButton();
    cmnbutton->SubclassWindow(hWnd);
    }
    else if( style == 0x0000000b)//子类化静态文本
    {
    CSkinStatic *skinstatic=new CSkinStatic();
    skinstatic->SubclassWindow(hWnd);
    skinstatic->DrawTransparent(TRUE);
    }
    else if( style == 0x00000007)//子类化分组框
    {
    CStaticGrp *staticgrp=new CStaticGrp();
    staticgrp->SubclassWindow(hWnd);
    }
    }