2016-12-14 7 views
0

Я запускаю Internet Explorer из своего приложения Win32 как отдельный процесс. Позже я хочу динамически менять фоновый цвет этого Internet Explorer из моего приложения. Я могу получить HWND из IEXPLORE.EXE:Как изменить цвет фона iexplore динамически

HWND iexplor = GetForegroundWindow(); //assuming my explorer is active window currently 

Итак, теперь с этим HWND например, есть ли способ я могу изменить цвет фона IEXPLORE?

Обычные API-интерфейсы Win32 терпят неудачу, потому что их отдельный процесс (доступ запрещен).

Любые идеи или предложения по этой проблеме?

Ниже код не удается, потому что IE является отдельным процессом:

HWND activeWindow = GetForegroundWindow(); 
if (activeWindow) 
{ 
    HBRUSH brush = CreateSolidBrush(RGB(0, 0, 0));     
    SetClassLongPtr(activeWindow, GCLP_HBRBACKGROUND, (LONG)brush); 

    InvalidateRect(activeWindow, NULL, TRUE); 
    int redraw = ::UpdateWindow(activeWindow); 
} 
+0

Это вряд ли будет хорошо работать в любом сценарии, что/почему конкретно вы хотите сделать? изменить цвет хрома? - в недавних версиях этого мало, измените цвет отображаемой веб-страницы? - Последнее возможно с COM или MAA. –

+0

Это звучит совершенно нелогично. На некоторых машинах нет IE. Могут быть значительные изменения в способе реализации IE, его иерархии процессов и окон. Надеясь, что вы, возможно, сможете взломать кисть класса, как это, свидетельствует об отсутствии понимания того, как работает Win32. Вы только действительно получите удовлетворение здесь, когда будете корректировать свои ожидания, чтобы быть более реалистичными. –

ответ

0

Во-первых, IE не гарантируется на переднем плане, когда вам это нужно. Вместо этого вы должны перечислить открытые дескрипторы HWND определенного процесса, который вы запускаете. Посмотрите на EnumThreadWindows(), EnumChildWindows() и т.д.

Во-вторых, как только у вас есть соответствующие HWND в окне IE, вы можете get its IHTMLDocument2 interface, а затем использовать DOM интерфейсы IE, чтобы манипулировать содержанием браузера по мере необходимости. Например, установив свойство IHTMLDocument2::bgColor. Или используя свойство IHTMLDocument2::body для извлечения интерфейса IHTMLBodyElement для элемента <body>, а затем установки свойства IHTMLBodyElement::bgColor.