• hook 换肤ERROR 汇总


    以下为hook dll在项目应用中,由大家帮助发现的BUG:
    1.hook Dialog,又发现一个小BUG,就是在SetWindowText设置caption时,不刷新过来,本以为是WM_SETTEXT消息刷新下,发现不行,老招,打印所有消息,发现存在个WM_GETICON消息,处理下,调用NCPAINT,搞定,记录下.
    2.hook Button, 必须在WM_SETTEXT中加一个刷新,不然在SetWindowText时,系统又自动刷回原形了,搞定,记录下

    3.今天又出现一个BUG,在list下,先建立一个能出现滚动条的list ,再点击按钮,切换list到刚好满又没有滚动条时,会发现最后一条点不了,查了下,是因为list中响应WM_NCPAINT消息,注释掉就好了,但OnNcPaint中要上层自绘,所以OnNcPaint最前面加上 DefWindowProc(WM_NCPAINT, 1, 0);,临时解决,重写控件库时再改.

    4.原来绘制dialog时,将WS_CAPTION去掉,但引起一个BUG,就是在vasta下,会出现在打开对话框下再出现另存为显示不全的BUG。用spy++抓了个消息0x00AE,直接干掉,把WS_CAPTION恢复过来,好像OK了,google了下:

    0x00AE://WM_NCUAHDRAWCAPTION
    0x00AF://WM_NCUAHDRAWFRAME
    这两条消息是在xp sp2后加的,xp在以前有个bug在某些时候Titlebar会画错.

    我靠,这么说在win2K下还可能有现原形:继续跟进

                      case 0x00AE:
    		{
    			DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
    			if (dwStyle & WS_VISIBLE) 
    			{
    				SetWindowLong(hWnd, GWL_STYLE, (dwStyle & ~WS_VISIBLE));
    			}
    			LRESULT lr = ::DefWindowProc(hWnd, uMsg, wParam, lParam);
    			if(dwStyle & WS_VISIBLE ) 
    			{
    				SetWindowLong(hWnd, GWL_STYLE, dwStyle);
    			}
    
    			return lr ;
    		}

    接上面的,继续TODO解决,既然只有在vista以上的版本出现显示不全的BUG,而0x00AE://WM_NCUAHDRAWCAPTION
    0x00AF://WM_NCUAHDRAWFRAME在vista以上的版本肯定能用,所以只对vista以上版本恢复WS_CAPTION,其余保持不变

    5.点击最小化,再弹出about窗口,发现不能关闭,必须先切换到ncactive才OK,仔细查了下代码,把//if (!bActive)
     //{
     // return 1;
     //}
     //else
     //{
     // return 0;
     //}

    改为return Default();,搞定.原因很晕.

    原因搞清楚了

    ://----------------------------------------------------------
     // When the wParam parameter is FALSE, an application should return TRUE
     // When wParam is TRUE, the return value is ignored.
        // 这里注意不要弄个else return 0;,不然最小化时弹出about框会被禁用!!
     // 当然也不能直接调用Default();,不然原始窗口就绘出来了.
     // ---------------------------------------------------------
    所以改成

     if (!bActive)
     {
      return TRUE;
     }

    6.同样最小化弹出后,发现所有的子控件消失了,仔细排查后,发现是NCCASIZEI消息中加了个自定义消息,自己本意是想让用户可以在外面再次控制,结果是如果这个消息被响应了,那么自然OK,不被响应(也就是不加on_message)那么子控件就没了,很郁闷,先注释掉吧----2011-10-29

    7.enable消息时,发现bs_icon的按钮和group按钮会出现系统默认绘制,所以把Default屏蔽了,发现对enable没有影响,另groupbox还出现重影,对父窗口相应区域刷新即可.---------2011-10-31

    8.自已发现在多字节环境下使用UNICODE皮肤库,按扭点击后会出现边角,暂不解决,------------------------------2011-11-3

    9. XP 下需设置SWP_FRAMECHANGE  以发送 WM_NCCALCSIZE  而Vista/WIN7系统会自动发送 -------------- 2011-11-4

    10.再次发现在多字节环境下使用UNICODE皮肤库,SkinScroll挂钩combobox后,scroll点击不了,暂不解决 ------2011-11-9

    11.CMENU的left键能展开子项(无论子项在右边还是左边)而right键能收起子项,这也让子项的m_hWnd变为无效,所以这时相当于对应的SkinMenu已被释放,这时对它赋值,必挂,这个问题同时也存在于dan.g的代码中,加入判断m_hWnd是否仍是窗口即可。-----------2011-11-12

  • 相关阅读:
    QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法
    hdu 5312 Sequence(数学推导——三角形数)
    Windows 操作系统与 .NET Framework
    Cocos2d-x手机游戏开发与项目实践具体解释_随书代码
    Uva 10081 Tight words (概率DP)
    从零使用qemu模拟器搭建arm执行环境
    hdu 2255 奔小康赚大钱(KM算法)
    最大子序列和问题
    深入理解javascript之高级定时器
    openstack 镜像自动扩容 resize拉伸
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693589.html
Copyright © 2020-2023  润新知