是设置属性错了????还是少了那步呢????//静态库接口函数内部;程序在InitInstance函数调用。
BOOL UserMirroUI(BOOL Switch)
{
CResManager & res = CResManager::GetResManager();
        //CResManager类的成员变量钩子类型g_hHook;
if(Switch)
{
if(res.g_hHook != NULL)
return FALSE;

res.g_hHook = SetWindowsHookEx(WH_CBT,CBTProc,0,GetCurrentThreadId());
}
else
{
if(res.g_hHook)
{
UnhookWindowsHookEx(res.g_hHook);
res.g_hHook = NULL;
}
}
return TRUE;
}钩子消息处理函数
LRESULT CALLBACK CBTProc( int nCode,WPARAM wParam,LPARAM lParam )
{
CResManager & res = CResManager::GetResManager();
if( HCBT_CREATEWND == nCode )
{
TCHAR tzClassName[64] = { 0 };
GetClassName( (HWND)wParam,tzClassName,sizeof(tzClassName)-1 );
if( _tcsicmp( tzClassName,_T("#32770") ) == 0 )
{
PMirroUIData pMirroUIData = new MirroUIData;
pMirroUIData->oldWndProc = (WNDPROC)SetWindowLong( (HWND)wParam,GWL_WNDPROC,(LONG)WindowProcFrame);
                        旧窗口消息处理函数
pMirroUIData->lStyle = GetWindowLong( (HWND)wParam,GWL_STYLE );
pMirroUIData->lStyleEx = GetWindowLong( (HWND)wParam,GWL_EXSTYLE );
pMirroUIData->bTracking = FALSE;
pMirroUIData->nMouseDownNCHTTEST = HTERROR;
pMirroUIData->nNcHitTestCode = HTERROR;
pMirroUIData->hClientBrush = NULL;
SetProp( (HWND)wParam,_T("MirroUI_Prop"),(HANDLE)pMirroUIData );
}
}
return CallNextHookEx(res.g_hHook,nCode,wParam,lParam);
}LRESULT CALLBACK WindowProcFrame( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
{
LRESULT lResult = 0;
PMirroUIData pMirroUIData = (PMirroUIData)GetProp( hWnd,_T("MirroUI_Prop") );
switch( uMsg )
{
case WM_INITDIALOG:
return lResult;
case WM_NCDESTROY:
break;
case WM_NCCALCSIZE:
break;
case WM_NCACTIVATE:
return 1L;
case WM_ACTIVATEAPP:
break;
case WM_EXITSIZEMOVE:
break;
case WM_SIZING:
break;
case WM_SIZE:
case WM_NCPAINT:
return 0L;
case WM_NCHITTEST:
case 0x00AE://:WM_NCUAHDRAWCAPTION
case 0x00AF://:WM_NCUAHDRAWFRAME;
return TRUE;
case WM_NCMOUSEMOVE:
break;
case WM_NCMOUSELEAVE:
break;
case WM_NCLBUTTONDOWN:
break;
case WM_NCLBUTTONUP:
break;
case WM_LBUTTONUP:
break;
default:break;
}
return ::CallWindowProc( pMirroUIData->oldWndProc,hWnd,uMsg,wParam,lParam );
}

解决方案 »

  1.   

    别的不说,你的CBTProc里面明明过滤了对话框的类名。
      

  2.   

    你的程序是 带静态库的, 同时你要 勾住别的 程序 ?2楼不说了吗。
    if( _tcsicmp( tzClassName,_T("#32770") ) == 0 )
    就是 对话框(#32770) ,
    你只处理 基于对话框 的 程序,
    那么 Frame 是在 else 里了。
    else{}
      

  3.   

    姐姐帮助我太大了!
    不明白,这个新定义的消息处理函数WindowProcFrame是自动被调用的吗???
      

  4.   

    SetWindowLong函数之后就会调用WindowProcFrame是吗???这是窗口子类化的意思????
    看下面的话,难道我不使用钩子,窗口子类化不行吗???
    应该明白HOOK和子类是什么回事吧。下面再解释一下
    为什么不在HOOK里处理消息。前面已经提到,HOOK是帮助我们把DLL注入别人的进程。
    而windows子类处理只能在进程内处理消息,所以只有我们到了别人的进程空间内,才
    能做出消息屏蔽的动作。这样说大家都能明白了吧。
      

  5.   

    把“if( _tcsicmp( tzClassName,_T("#32770") ) == 0 )”
    去掉 不行吗 , 那就 与 类名 无关了。
      

  6.   

    return CallNextHookEx之后,会自动调用WindowProcFrame呀???
      

  7.   

    能不能找到把
    pMirroUIData->oldWndProc = (WNDPROC)SetWindowLong( (HWND)wParam,GWL_WNDPROC,(LONG)WindowProcFrame);oldWndProc set 回去的 地方,否则会 一直调用你的 WindowProcFrame
      

  8.   


    把“if( _tcsicmp( tzClassName,_T("#32770") ) == 0 )”
    去掉 不行吗 , 那就 与 类名 无关了。
    //去掉之后,那窗口与对话框都能被处理吧???
      

  9.   

    “去掉之后,那窗口与对话框都能被处理吧”
    是啊。
    windows 有2种窗口。
    一种就是 ‘窗口’
    另一种是  ‘对话框’对话框是  一种特殊的窗口。