123456

 

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

posted on 2011-09-23 18:49  hgy413  阅读(273)  评论(0编辑  收藏  举报

导航