0

感谢这个答案,我可以使用以下 C++ 控制台应用程序更改我的背景Solution explorer和前景色。但问题是这段代码不会改变.Server explorerVisual studio 2010Class View

在此处输入图像描述

根据 VS 中的 Spy++,Class View主要由三个 Window 类组成,两个LiteTreeView32和一个VsSimpleSlider. 通过 VS 调试,我验证了程序正确地将颜色更改消息发送LiteTreeView32Class 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;
}
4

0 回答 0