以下为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