我发现SetClssLong不成功的原因是: Access is denied.

解决方案 »

  1.   

    需要打破进程边界墙,做个钩子注入其他应用程序的进程空间,然后再SetClassLong就可以了
      

  2.   

    方法有:
       1.使用注册表插入DLL;
       2.使用Windows挂钩来使用注册表插入DLL;
       3.使用远程线程来插入DLL;
       4.使用特洛伊来插入DLL;
       5.将DLL作为调试程序来插入;
       6.用Windows 98上的内存映射文件插入代码;
       7.用CreateProcess插入代码;     使插入的DLL或插入的代码运行SetWindowLongPtr(hwnd,GCL_HBRBACKGROUND,MyBrush);All OK!!!!!!
      

  3.   

    这种方法是不会生效的!
    对于同一进程内的窗口类,SetClassLong改变过后只在下一次用它来创建窗口时才生效!对于已经存在的窗口,类信息已经存入窗口信息,是无法改变当前画刷的。
      

  4.   

    首先感谢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);
      

  5.   

    这样写是不对的。如果想很快看到结果,把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));
    以下基本相同...
      

  6.   

    请问newx我的写法为什么不对?不知道问什么今天运行就没有error code = 6 的错误了(难道昨天系统有误)。我尝试了三种声明,都行。我认为三种声明在此并没有什么区别。关于内存泄漏,我将SetClassLong的返回值使用DeleteObject删除,并没有出错。(对于Stock对象,可能Windows作了保护,我使用的是Windows2000 Professional English Version).
      

  7.   

    "g_hBrush是全局变量。按我的理解Hook DLL 注入另一个应用程序的进程空间后,被注入
    的应用程序应该得到g_hBrush的一份拷贝。"
    我认为被注入的应用程序!不会!得到g_hBrush的一份拷贝,不知对否?
    你的试验证明了这是对的吗?