感谢这个答案,我可以使用以下 C++ 控制台应用程序更改我的背景Solution explorer
和前景色。但问题是这段代码不会改变.Server explorer
Visual studio 2010
Class View
根据 VS 中的 Spy++,Class View
主要由三个 Window 类组成,两个LiteTreeView32
和一个VsSimpleSlider
. 通过 VS 调试,我验证了程序正确地将颜色更改消息发送LiteTreeView32
到Class View
. 我猜 LiteTreeView32 可能不接受这些颜色变化消息,但我不确定。任何线索将不胜感激。此外,知道如何更改Properties window
看起来像 .NET 组件的颜色吗?
#include <iostream>
#include <windows.h>
#include "psapi.h"
#include "shlwapi.h"
#include "commctrl.h"
using namespace std;
COLORREF clr = RGB(22,22,22);
COLORREF clr2 = RGB(220,220,220);
BOOL CALLBACK wenum( HWND hwnd, LPARAM lParam)
{
const UINT cb = 261;
static wchar_t name[] = L"SysTreeView32",//other treeviews including solution explorer
name2[] = L"LiteTreeView32",//treeview inside of class view
name3[] = L"WindowsForms10.STATIC.app.0.1fed012_r46_ad1",//hopefully property grid
name4[] = L"VsSimpleSlider",
tmp[cb] = {0};
int res = ::GetClassNameW( hwnd, tmp, 260 );
if(res && (
0 == _wcsicmp( name, tmp )
||0 == _wcsicmp( name2, tmp )
||0 == _wcsicmp( name3, tmp )
||0 == _wcsicmp( name4, tmp )
))
{
::SendMessageW( hwnd, TVM_SETBKCOLOR, 0, (LPARAM)clr );
::SendMessageW( hwnd, TVM_SETTEXTCOLOR, 0, (LPARAM)clr2 );
wcout << tmp << endl;
}
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);
int dummy;
cin >> dummy;
return 0;
}