根据前两贴的高手指点,我在网上下了个 cbuttonST 的代码实例,根据代码实例,它其实是很符合我的要求的.
cbuttonST实例中子类化按钮的代码如下
short shBtnColor = 30;
CWnd *pParentWnd = CWnd::FindWindow(NULL,L"CButtonSTDemo"); //CButtonSTDemo为窗口名
HWND hButton=::FindWindowEx(pParentWnd->GetSafeHwnd(),NULL, _T("Button"), _T("Button1"));
CButtonST *pBtn = new CButtonST();
pBtn->FromHandle(hButton); //hButton是按扭的句柄。
pParentWnd->FromHandle(::GetParent(hButton));
pBtn->SubclassDlgItem(1000,pParentWnd); //ID是按扭控件的ID
pBtn->SetIcon(12001); //图片的的ID
pBtn->OffsetColor(CButtonST::BTNST_COLOR_BK_IN, shBtnColor);
我新建了一个项目A,在A中实现
点击 按钮1 子类化 A程序 中的buttonA按钮
点击 按钮2 子类化 B程序 中的buttonB按钮 (B程序是另外打开的一个程序,它们都通过FindWindow获得窗口句柄)
A程序::FindWindow(NULL,L"buttonA"),然后子类化buttonA的按钮.
B程序::FindWindow(NULL,L"buttonB"),然后子类化buttonB的按钮.
结果B程序执行完代码后buttonB的按钮消失不见,而A程序执行完后代码效果正常显示.
这个中间我以为是图片资源的问题,所以我请求资源都是用的同样的绝对路径..
通过上面的实验,我以为不是本程序执行的代码无法执行 "子类化按钮" 的功能,我又把上面的代码写成C.DLL,并把 "子类化按钮的类" 定义为输出类,通过PE工具先把第三方程序c.exe的区段新增一个.SCODE.接着又把C.Dll添加它的输入表.又接着通过OD把它反编译在UPDATAWINDOW函数后JMP到新开的.SCODE中, 编写执行 C.DLL中"子类化按钮的类"后又JMP返回到原来该执行的地方..做完这些工作感觉就相当于在C.EXE中操作了下"也在B程序里面FindWindow(NULL,L"B"),然后子类化B的按钮..."这个功能了..
可是显示的结果还是让是失望,正常运行,想子类化的按钮也不见了....