WM_ERASEBKGND в SysListView32 рабочего стола

Тема в разделе "WASM.WIN32", создана пользователем provocateur, 15 мар 2009.

  1. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    Перерыл форум, много чего нашел, однако все пути какие-то не такие.
    Мне показалось, что рисовать свое изображение на рабочем столе "под иконками" лучше всего будет через WM_ERASEBKGND.
    Осталось только засунуться туда.
    Мне подумалось, что можно взять отработанный уже вариант с хуками WH_CALLWNDPROC, но или я не там ловлю WM_ERASEBKGND, либо его там вообще поймать невозможно.
    Для утаскивания координат иконок использовалась простая штука, примерно так:

    Код (Text):
    1. GetMsgProc proc nCode:DWORD,wParam:WPARAM,lParam:LPARAM
    2.     .if (nCode == HC_ACTION)
    3.         mov ebx,lParam
    4.         mov eax,CWPSTRUCT.message[ebx]
    5. .....
    6.         .if eax == WM_SAVE
    7.             invoke  SaveToFile
    8. ......
    9.         .endif
    10.  
    11.         invoke CallNextHookEx,hHook,nCode,wParam,lParam
    12. ......
    13.  
    14. GetMsgProc endp
    Но WM_SAVE я отправлял сам из основной программы. А вот откуда возьмется WM_ERASEBKGND непонятно. По идее его должна слать система, но где ловить я не понял.

    Еще есть подозрение, что нужно использовать не WH_CALLWNDPROC, а что-то другое.

    P.S.
    Может кто-то уже решил эту задачу именно таким или похожим способом (WM_PAINT :)? директиксы и оверлеи не подходят.
     
  2. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    создать кисть hBrush
    найти хэдл рабочего стола hrs ( который по идее всегда 0 )

    .if .... хук на WM_ERASEBKGND (?) - как только рабочему столу будет отправлено это сообщение, перехватываем и обрабатываем:

    invoke SelectObject, hrs,hBrush
    invoke PatBlt, hrs,0,0,(ширина),(высота),PATCOPY

    return TRUE

    P.S. не пробовал
     
  3. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    Blackbeam, вы имеете ввиду, вместо
    .if eax == WM_SAVE
    поставить
    .if eax == WM_ERASEBKGND
    ?
    так не работает
     
  4. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    конечно - твоя программе НЕ получит это сообщение, оно предназначено не ей, а рабочему столу, его нужно ПЕРЕХВАТИТЬ
     
  5. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    сначала порисуй в своей программе, бывают разные заморочки с битмапами и кистями - ошибок вроде компилятор не выдаёт, а ничего неработает..
     
  6. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    Blackbeam, в "своей программе" все работает. мне непонятно только какой хук использовать, и в каком конкретно месте искать WM_ERASEBKGND

    Надо примерно вот такое, только на рабочем столе: http://rghost.ru/154828
     
  7. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    всё что у меня есть ... насчот хуков кури Iczelion'a
     
  8. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    спасибо конечно.
    но это все не то. календарь dzp я уже видел, он отдельным окном поверх иконок, таких программ много.
    про хуки я этого Iczelion уже перечитал до дыр (и еще кого-то). сделал выдергивалку координат иконок, но рисование пока не поддается
     
  9. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    рабочий стол - это папка, мы же видим - листвьев специализированный, он вроде бы в систем32 сидит

    мне так кажется, ничего не могу сказать точно

    как найти програму, сообщения которой надо перехватывать и как их перехватывать - это то, чем занимаются вирусописатели, вроде бы... статей на эту тему есть
     
  10. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    ситуация вроде как более менее прояснилась. сообщение вроде как отлавливается (сделал чтобы вываливалось куча месседжбоксов), но непонятно что делать с тем фактом, что для запрета последующей отработки WM_ERASEBKGND нужно "вернуть число отличное от нуля". как и куда вернуть, если необходимо вызывать CallNextHookEx(hHook,nCode,wParam,lParam) ?
     
  11. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Попробуй хукнуть всю WndProc, там отхвати сообщение и обрабатывай его, а все остальное отдавай в старую WndProc. Должно работать.
    Но для этого нужно загрузить свою ДЛЛ в експлорер.

    Сегодня вечером сам попробую, если получится -- отпишусь.
     
  12. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    mrcrown, а поподробней можно? (если получится :)
    "всю WndProc" это в смысле через SetWindowLong ( hListView, GWL_WNDPROC, NewProc) ?
    тогда как загрузить dll в explorer?


    PS
    Вообще интересная фигня, обои отображаются даже если грохнуть SysListView32 и SHELLDLL_DefView и даже закрыть explorer :) непонятно, неужели винда действительно рисует обои несколько раз
     
  13. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    provocateur, вряд ли пригодится тебе, но в 98, если рабочий стол отображается, как веб-страница (обойки .jpg, .gif etc.), обои рисует окно с классом "Internet Explorer_Server" (собственно, веб-страница), parent у него SHELLDLL_DefView.
     
  14. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    iZzz32, и не только в 98, в более поздних тоже работает. но мне почему-то этот вариант не нравится. туда проникнуть, как мне кажется, сложнее, и ie даже в такой роли меня смущает :)
     
  15. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Ну вариантов куча! Даже через те же Extensions. Тут я приводить примеров инжекта не буду - инфы и так хоть ж**ой жуй

    Edit1:
    Короч, что получается, нарисовать под иконками получается, если рисовать под SysListView32 То есть в SHELLDLL_DefView...
    Но проявляется непониааааааааатная фигня. иногда експлорер вылетает с критической ошибкой.
    Edit2:
    Хм... 64х64 битмапку рисует без проблем. я хз че, может просто вечер, и ппц как все впадлу. :) Могу дать сорц ДЛЛки но паскаль.
     
  16. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    ну и паскать посмотрю, не думаю, что он будет сильно уж отличаться .
    а фигня, скорей всего, потому что рисуется действительно сразу в нескольких окнах
     
  17. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Почему в нескольких? в одном: SHELLDLL_DefView, ну это фигня, может ты разберешся.
    Сорц скину ближе к 16:00 МСК.
     
  18. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    mrcrown, в нескольких, потому что последовательное убийство SysListView32, SHELLDLL_DefView и Progman не приводит к исчезновению обоев. хотя, может быть, что обои действительно рисуются в самом низу, но когда я пытаюсь зарисовывать фон SysListView32, то видно как моментально поверх моего изображения накладываются обои
     
  19. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    А ты в этом смысле, да система рисует обои и без этих окон, если я не ошибаюсь, то их рисует winlogon.
     
  20. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    это dll? ее надо сунуть внутрь explorer?