读书人

程序执行期间怎么替换类名

发布时间: 2012-03-29 12:53:12 作者: rapoo

程序执行期间如何替换类名?
以下引自“http://bbs.pediy.com/showthread.php?t=143379”

SkinSharp是一款换肤软件,很是小巧实用。只是,最近发现两个小BUG(算BUG吧?)
1.只支持RichEdit1.0,RichEdit2.0及之后的版本都不支持
2.不支持AnimateWindow函数,也就是动画窗口
于是,调试了一下,发现RichEdit的BUG似乎很好解决,如下:
对GetClassNameA下断,运行到这里断下:
10019380 50 push eax ; 窗口类名返回到这里
10019381 51 push ecx
10019382 FF15 90610210 call dword ptr [10026190] ; user32.GetClassNameA
10019388 8B56 0C mov edx, dword ptr [esi+C]
1001938B 8B0D D8A80210 mov ecx, dword ptr [1002A8D8]
10019391 8D4424 0C lea eax, dword ptr [esp+C]
10019395 52 push edx
10019396 50 push eax
10019397 E8 E4F9FFFF call 10018D80 ; 跟进去
往下走,到这里:
10018E43 68 2CA40210 push 1002A42C ;窗口类名"RICHEDIT"
10018E48 56 push esi ;"RICHEDIT","RICHEDIT20A","RICHEDIT50W",RichEdit起码有这三种类名
10018E49 FFD7 call edi ;比较
10018E4B 83C4 08 add esp, 8
10018E4E 85C0 test eax, eax
10018E50 75 18 jnz short 10018E6A ;比较的结果当然就是,除了1.0,其他版本概不支持
解决方法:在SkinH_Attach之后,勾住这里:call 10018D80。把高版本的类名替换成"RICHEDIT"就可以了。
至于第二个问题,主要是因为作者没有处理两个消息:
WM_PRINT 和 WM_PRINTCLIENT
两个消息的wParam就是HDC,用这个句柄重画皮肤就可以了。
我只会做简单的事情,至于脱壳、直接修改DLL这种复杂的事还是留给其他人去做吧。

我是一名菜鸟,对汇编更是不懂,对于两个问题(特别是第一个),不知在VC中如何实现,请高手赐教。

[解决办法]
/*
功能:指定窗体和控件的换肤类型
返回值: 成功返回0, 失败返回非0
*/
int __stdcall SkinH_Map(
HWND hWnd,//指定窗体或控件的句柄
int nType//换肤类型
);

//换肤类型
#define TYPE_UNKNOWN0//未知类型
#define TYPE_ANIMATE1001//动画控件
#define TYPE_CHECKBOX1002//复选框
#define TYPE_COMBOBOX1003//组合框
#define TYPE_COMBOLBOX1004//组合下拉框
#define TYPE_CONTROLBAR1005//控件栏
#define TYPE_DATETIME1006//日期控件
#define TYPE_EDITBOX1007//文本框
#define TYPE_GROUPBOX1008//分组框
#define TYPE_HEADERCTRL1009//列头控件
#define TYPE_HOTKEY1010//热键控件
#define TYPE_IPADDRESS1011//IP地址控件
#define TYPE_LABEL1012//标签控件
#define TYPE_LISTBOX1013//列表框
#define TYPE_LISTVIEW1014//列表视图
#define TYPE_MDICLIENT1015//MDI客户区
#define TYPE_MENU1016//菜单
#define TYPE_MONTHCAL1017//月历控件
#define TYPE_PICTURE1018//图片框
#define TYPE_PROGRESS1019//进度条
#define TYPE_PUSHBUTTON1020//普通按钮
#define TYPE_RADIOBUTTON1021//单选框
#define TYPE_REBAR1022//重组栏
#define TYPE_RICHEDIT1023//富文本框
#define TYPE_SCROLLBAR1024//滚动条
#define TYPE_SCROLLCTRL1025//内置滚动条的控件
#define TYPE_SPINCTRL1026//调节器
#define TYPE_STATUSBAR1027//状态栏
#define TYPE_TABCTRL1028//选择夹
#define TYPE_TOOLBAR1029//工具栏
#define TYPE_TOOLBARWND1030//MFC工具栏窗体
#define TYPE_TRACKBAR1031//滑条控件
#define TYPE_TREEVIEW1032//树形视图
#define TYPE_WINDOW1034//标准窗体
#define TYPE_COMCTRL1036//通用换肤
#define TYPE_PAINTCTRL1037//通用换肤

/*
功能:设置窗体是否可以移动
返回值: 成功返回0, 失败返回非0
*/
int __stdcall SkinH_SetWindowMovable(
HWND hWnd,//窗口句柄
BOOL bMovable//0为不可移动, 1为可移动
);


看清文档再用………………

读书人网 >VC/MFC

热点推荐