@aloneguid ... Had to see this a long time ago .. thanks sir!
@ver (regarding solution vs 2008 for solution;) - an approach like B52, carpet bombardment of everything that SysTreeView32 inside devenv.exe. A possible additional parameter for the desired color, otherwise RGB (220,220,220) is the best for me.
#include <windows.h> #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; }
user1195662 Feb 07 2018-12-12T00: 00Z
source share