Вобщем интересует как правильно загрузить эту библиотеку, чтобы стиль и клиентской и неклиентской части окна был подхвачен Пока что, как видно, верный стиль лишь у неклиентской части окна
Манифест на месте. Собственно это обычный калькулятор - т е все внутренности сохранены и манифест в том числе в ресурсах присутствует в нормальном виде. Возможно что необходимо UXTHEME.DLL использовать именно так как он и используется при программной установке стилей. Но хотелось бы эо сделать верно, тобишь также как это делает и система. Если есть идеи - выражайтесь. Спасибо
Для того чтобы стиль подхватился сразу думаю, что достаточно будет привязать User32.dll к загрузчику через его импорт, но если это сделать наблюдается странное поведение: при упоминании в импорте о User32.dll, при загрузке появляется какая то левая область памяти в карте памяти процесса именно в том месте куда необходимо в последствие грузить файл из памяти. При ее освобождении - все сразу же рушится - видать это что то необходимое для правильной работы User32.dll. Может кто то в курсе что это за бока? Либо может есть идеи по поводу того как правильно зарузить UXTHEME.DLL? Было бы неплохо услышать хоть какие-то мысли по теме.
Никто вручную не подгружает. Есть манифест, его достаточно. Можно в инете поискать установку тем вручную, вроде бы видел такие приблуды.
UTeX Небойсь процесс сам создаешь ? Вручную как в неббете ?? Тогда это гемор со стилями. На этом форуме затрагивалась эта тем. Правда уже не помню нашли ответ или нет.
TermoSINteZ Я гружу ПЕ из дампа в памяти процесса загрузчика. думаю просто какая то глупость ускользнула я не нашел ее почему-то
вобщем были какие-то идеи по поводу EnableTheming(), но это развеялось сразу же после теста как оказалось она влияет на работу uxtheme.dll во всей системе, а не в процессе, и к тому же получилось только отключить с ее помощью стили - включить увы не удалось Код (Text): HRESULT Result = ((HRESULT(__stdcall *)(BOOL fEnable))GetProcAddress(LoadLibrary(L"uxtheme.dll"), "EnableTheming"))(FALSE);
Правда где-то бродит рядом, но не совсем ясно где. Что из библиотеки uxtheme.dll оказывает влияние на все контролы созданные в процессе, а не в системе в общем? Может кто-то в курсе?
Я ничего не понял; Но когда я хотел, чтобы кнопки отображались со стилями, приходилось не только добавлять манифест, но и вызывать InitCommonControls(Ex) перед созданием первого окна. Или перед регистрацией класса? Нет, скорее всё же перед созданием первого окна.
MSDN -> WM_THEMECHANGED Notification: Так что в аттаче - пример, как низя! Код (Text): .386 .model flat,stdcall option casemap:none inclib macro x include x.inc includelib x.lib endm include windows.inc inclib user32 inclib kernel32 inclib gdi32 ;inclib comctl32 inclib uxtheme .const id equ 2000 STAP_ALLOW_NONCLIENT equ 1 STAP_ALLOW_CONTROLS equ 2 STAP_ALLOW_WEBCONTENT equ 4 WM_THEMECHANGED equ 031Ah .data _button db "button",0 _1 db "#1",0 _2 db "#2",0 _3 db " Nizzia !",0 .data? .code DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .if uMsg==WM_CLOSE invoke EndDialog,hWnd,0 .elseif uMsg==WM_INITDIALOG invoke CreateWindowEx,0,addr _button,addr _1,WS_CHILD OR WS_VISIBLE OR WS_TABSTOP, 10, 20,200,30,hWnd,id+1,lParam,0 invoke CreateWindowEx,0,addr _button,addr _2,WS_CHILD OR WS_VISIBLE OR WS_TABSTOP, 10, 60,200,30,hWnd,id+2,lParam,0 invoke CreateWindowEx,0,addr _button,addr _3,WS_CHILD OR WS_VISIBLE OR WS_TABSTOP OR BS_AUTOCHECKBOX,10,100,200,30,hWnd,id+3,lParam,0 .elseif uMsg==WM_COMMAND && wParam==id+3 invoke SendDlgItemMessage,hWnd,id+3,BM_GETCHECK,0,0 xor ecx,ecx .if eax==BST_UNCHECKED mov ecx,STAP_ALLOW_NONCLIENT or STAP_ALLOW_CONTROLS or STAP_ALLOW_WEBCONTENT .endif invoke SetThemeAppProperties,ecx invoke SendDlgItemMessage,hWnd,id+1,WM_THEMECHANGED,0,0 ; Nizzia! ; invoke SendDlgItemMessage,hWnd,id+2,WM_THEMECHANGED,0,0 ; Nizzia! invoke SendDlgItemMessage,hWnd,id+3,WM_THEMECHANGED,0,0 ; Nizzia! .else mov eax,FALSE ret .endif mov eax,TRUE ret DlgProc endp start: invoke GetModuleHandle,0 invoke DialogBoxParam,eax,100,0,offset DlgProc,eax invoke ExitProcess,eax ; invoke InitCommonControls end start // .rc 100 DIALOGEX 0,0,260,100 STYLE DS_CENTER | WS_OVERLAPPEDWINDOW EXSTYLE WS_EX_TOPMOST | WS_EX_CLIENTEDGE CAPTION "Forbidden WM_THEMECHANGED usage" FONT 8, "Tahoma" {} 1 24 "manifest"
http://www.wasm.ru/forum/viewtopic.php?id=25101 Тут чето затрагивалось вроде... Я сам пробовал подключить theames ручками, улучшив пример из Неббета, но все попытки завершились неудачей (смотрел что делает CreateProccess в подробностях, но так и не нашел момент нужный) и я забил на это, так как конечную цель переформулировал и переделал (в общем отпала надобность запускать процесс в ручную). Если что найдешь - напиши. Ибо чисто интересно, хотя в практической точки зрения - бессмысленно так гемороится.
если разберемся то конечно все будет тут странно слышать такое. дело в том что загруженный мной ПЕ файл не должен отличаться в поведении от загруженного системой - если не касаться внутренностей - то визуальные стили сразу выдают какое-либо нестандартное поведение.
UTeX Дело не в поведении. Прога будет работать как надо. Просто видимо ей нехватает каких то данных в структурах процесса и окружения, чтоб понять стили
kero Прокомментируй немного пожалуйста свой пост. А то я что-то не могу понять о чем ты. Имел наверное ввиду, что это дело система контролирует а в ручную нельзя? или что-то еще?
Вот так всё должно быть в идеале (для своего кода ессно) Using Windows XP Visual Styles Enabling Visual Styles - SetWindowTheme(...), только ничего нет про воссоздания тем из дампа )
UTeX Комментирую: Что имел в виду - то в аттач полОжил, А "низзя" и "нельзя" - не одно и то же. Аттач при "неклассической" теме запускали? Чекбокс нажимали? Визуальные стили контролов #1 и #3 этого диалога от состояния чекбокса зависели? Если да - значит, аттач таки осуществляет запрошенное вами и даже сверх того: не на все контролы диалога, а только на часть из них. Способом, которым "низзя". Если же нет... Аттач отгружен с XP. У вас же, судя по картинке, Vista. Значит, Vista пилюйот на мой пример, противная.