Change background color of Solution Explorer in Visual Studio

后端 未结 5 1999
我在风中等你
我在风中等你 2020-12-05 09:02

Is there any way to change the background color of the Solution Explorer in Visual Studio using a Theme? - or any other way for that matter?

I can change it by chan

5条回答
  •  自闭症患者
    2020-12-05 09:59

    @aloneguid ...should have seen this long time ago.. thank you sir !

    @ver (regarding vs 2008 solution for solution;) - a B52 type of approach, carpet bombing on anything that is SysTreeView32 inside a devenv.exe. Possible extra param for desired color, otherwise RGB(220,220,220) - works best for me

    #include 
    #include "psapi.h"
    #include "shlwapi.h"
    #include "commctrl.h"
    
    
    COLORREF clr = RGB(220,220,220);
    
    BOOL CALLBACK wenum( HWND hwnd, LPARAM lParam)
    {
       const UINT cb = 261;
       static wchar_t    name[] = L"SysTreeView32",
                         tmp[cb] = {0};
       if( ::GetClassNameW( hwnd, tmp, 260 ) && 0 == _wcsicmp( name, tmp ) )
       {
          ::SendMessageW( hwnd, TVM_SETBKCOLOR, 0, (LPARAM)clr );
       }
    
       return TRUE;
    }
    
    BOOL CALLBACK EnumTops(HWND hwnd, LPARAM lParam) 
    {
        DWORD             dwThreadId  = 0, 
                         dwProcessId = 0;
        HINSTANCE         hInstance;
       static wchar_t derVS[]     = L"devenv.exe";
       wchar_t  name[_MAX_PATH]   = {0},
                *exe              = 0;
    
        HANDLE hProcess;
       if (!hwnd)  return TRUE;     // Not a window
       if (!::IsWindowVisible(hwnd)) return TRUE;       // Not visible
    
       if (!SendMessage(hwnd, WM_GETTEXT, sizeof(name), (LPARAM)name))
          return TRUE;      // No window title
       dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
       hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
       if( !GetModuleFileNameEx(hProcess, 0, name, sizeof(name))) goto exit;
    
       exe = ::PathFindFileNameW( name );
       if( (void*)exe == (void*)name ) goto exit; // mhm? maybe not exit?
    
       if( _wcsicmp( derVS, exe ) ) goto exit;
    
       EnumChildWindows( hwnd, wenum, (LPARAM)hProcess );
    
    exit:
       CloseHandle(hProcess);
       int res = GetLastError();
       return res;
    }
    
    int wmain(int argc, wchar_t * argv[]) 
    {
       if( argc >= 2 )
       {
          wchar_t *end = 0;
          long l = wcstol( argv[1], &end, 16 );
          clr = (DWORD)l;
       }
       ::EnumWindows(EnumTops, NULL);
       return 0;
    }
    

提交回复
热议问题