如何在一个应用程序中改变另一个应用程序的窗口类的背景画刷? 我发现SetClssLong不成功的原因是: Access is denied. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要打破进程边界墙,做个钩子注入其他应用程序的进程空间,然后再SetClassLong就可以了 方法有: 1.使用注册表插入DLL; 2.使用Windows挂钩来使用注册表插入DLL; 3.使用远程线程来插入DLL; 4.使用特洛伊来插入DLL; 5.将DLL作为调试程序来插入; 6.用Windows 98上的内存映射文件插入代码; 7.用CreateProcess插入代码; 使插入的DLL或插入的代码运行SetWindowLongPtr(hwnd,GCL_HBRBACKGROUND,MyBrush);All OK!!!!!! 这种方法是不会生效的!对于同一进程内的窗口类,SetClassLong改变过后只在下一次用它来创建窗口时才生效!对于已经存在的窗口,类信息已经存入窗口信息,是无法改变当前画刷的。 首先感谢bensilver 和 Chen_Hong_Fong的提示。我参考Jeffery的Advanced Windows写了一个DLL Hook, 出现错误是g_hBrush无效。(error code 6. The handle is invalid.)g_hWnd是有效的(SetWindowText成功)。g_hBrush是全局变量。按我的理解Hook DLL 注入另一个应用程序的进程空间后,被注入的应用程序应该得到g_hBrush的一份拷贝。不知道为什么出现这种错误。望高手解答。HBRUSH g_hBrush = NULL;HOOKBRUSH_API LRESULT CALLBACK GetMsgProc( int nCode, WPARAM wParam, LPARAM lParam ){ static BOOL fFirstTime = TRUE; if (fFirstTime) { // The DLL just got injected. fFirstTime = FALSE; g_hBrush = CreateSolidBrush(RGB(0,0,128)); SetClassLong( g_hWnd, GCL_HBRBACKGROUND, (LONG)g_hBrush ); TCHAR Message[256]; wsprintf((LPSTR)Message, TEXT("Error code = %d"), GetLastError()); ::MessageBox(g_hWnd, Message, TEXT("error"), MB_OK); SetWindowText(g_hWnd, TEXT("New String")); UpdateWindow( g_hWnd ); } return(CallNextHookEx(g_hhook, nCode, wParam, lParam));}To In355Hz,SetClassLong对于创建好的窗口也有效。应为它改变的是内存数据。下一次窗口绘制时,就能看到效果。(我已经成功改变自己进程内的窗口背景刷子)if(MyBrush.GetSafeHandle()) MyBrush.DeleteObject();MyBrush.CreateSolidBrush(RGB(128, 0,128)); SetClassLong(this->GetSafeHwnd(), GCL_HBRBACKGROUND, (LONG)MyBrush.GetSafeHandle());Invalidate(TRUE); 这样写是不对的。如果想很快看到结果,把g_hBrush由全局变量改成局部变量(或改成局部静态?),应该工作!但是这样做会资源泄漏。要解决资源泄漏,哎,我还要想想。你可以先尝试。HOOKBRUSH_API LRESULT CALLBACK GetMsgProc( int nCode, WPARAM wParam, LPARAM lParam ){ (static?) HBRUSH s_hBrush = NULL; if (NULL == s_hBrush) { s_hBrush = CreateSolidBrush(RGB(0,0,128));以下基本相同... 请问newx我的写法为什么不对?不知道问什么今天运行就没有error code = 6 的错误了(难道昨天系统有误)。我尝试了三种声明,都行。我认为三种声明在此并没有什么区别。关于内存泄漏,我将SetClassLong的返回值使用DeleteObject删除,并没有出错。(对于Stock对象,可能Windows作了保护,我使用的是Windows2000 Professional English Version). "g_hBrush是全局变量。按我的理解Hook DLL 注入另一个应用程序的进程空间后,被注入的应用程序应该得到g_hBrush的一份拷贝。"我认为被注入的应用程序!不会!得到g_hBrush的一份拷贝,不知对否?你的试验证明了这是对的吗? 大家有用MFC开发过GIS类似的系统吗? 关于psapi库函数的使用问题? GetProcAddress的问题 关于相对路径 关于sniffer的问题 想在win2k下写个与usb通讯的工具,但没这方面的经验,请高手指点一二! 急救急救!!! 请教:怎么杀掉自动生成desktop.ini和folder.htt文件的病毒?谢谢! 我建了很多对话框怎么把它们连起来象windows优化大师一样! 如何用pdflib打开pdf文件 请教vs.net bate怎样安装在中文windows2000上 关于ANSI字符集,Unicode字符集,和_T宏的问题
1.使用注册表插入DLL;
2.使用Windows挂钩来使用注册表插入DLL;
3.使用远程线程来插入DLL;
4.使用特洛伊来插入DLL;
5.将DLL作为调试程序来插入;
6.用Windows 98上的内存映射文件插入代码;
7.用CreateProcess插入代码; 使插入的DLL或插入的代码运行SetWindowLongPtr(hwnd,GCL_HBRBACKGROUND,MyBrush);All OK!!!!!!
对于同一进程内的窗口类,SetClassLong改变过后只在下一次用它来创建窗口时才生效!对于已经存在的窗口,类信息已经存入窗口信息,是无法改变当前画刷的。
(error code 6. The handle is invalid.)g_hWnd是有效的(SetWindowText成功)。g_hBrush是全局变量。按我的理解Hook DLL 注入另一个应用程序的进程空间后,被注入
的应用程序应该得到g_hBrush的一份拷贝。不知道为什么出现这种错误。望高手解答。HBRUSH g_hBrush = NULL;HOOKBRUSH_API LRESULT CALLBACK GetMsgProc( int nCode, WPARAM wParam, LPARAM lParam )
{
static BOOL fFirstTime = TRUE; if (fFirstTime) {
// The DLL just got injected.
fFirstTime = FALSE; g_hBrush = CreateSolidBrush(RGB(0,0,128));
SetClassLong( g_hWnd, GCL_HBRBACKGROUND, (LONG)g_hBrush );
TCHAR Message[256];
wsprintf((LPSTR)Message, TEXT("Error code = %d"), GetLastError());
::MessageBox(g_hWnd, Message, TEXT("error"), MB_OK);
SetWindowText(g_hWnd, TEXT("New String"));
UpdateWindow( g_hWnd );
}
return(CallNextHookEx(g_hhook, nCode, wParam, lParam));
}To In355Hz,
SetClassLong对于创建好的窗口也有效。应为它改变的是内存数据。下一次窗口绘制时,就能看到效果。(我已经成功改变自己进程内的窗口背景刷子)
if(MyBrush.GetSafeHandle())
MyBrush.DeleteObject();
MyBrush.CreateSolidBrush(RGB(128, 0,128));
SetClassLong(this->GetSafeHwnd(), GCL_HBRBACKGROUND, (LONG)MyBrush.GetSafeHandle());
Invalidate(TRUE);
{
(static?) HBRUSH s_hBrush = NULL; if (NULL == s_hBrush) {
s_hBrush = CreateSolidBrush(RGB(0,0,128));
以下基本相同...
的应用程序应该得到g_hBrush的一份拷贝。"
我认为被注入的应用程序!不会!得到g_hBrush的一份拷贝,不知对否?
你的试验证明了这是对的吗?