Похоже, это невозможно.Смотрите эту ссылку:
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/69839cec-3424-4300-9ac3-486b8c2fe492
Если вам нужно нарисовать некоторые элементы управления между фоном рабочего стола и значками рабочего стола, альтернативный шаг ниже:
- Создание пользовательского элемента управления в библиотеке элементов управления Windows.
- Включение пользовательского элемента управления в элемент управления ActiveX.
- Включение элемента управления ActiveX на веб-странице.
- Включение активногорабочего стола и установите веб-страницу в качестве фона рабочего стола.
Это можно сделать только в XP, поскольку Vista не поддерживает активный рабочий стол.
В другом посте предлагаетсячто вы могли бы сделать это с фоном окна проводника - если бы вы могли получить дескриптор окна, которое его составляет.Конечно, если это возможно, то возможно также получить дескриптор окна рабочего стола за значками.
Обновление: Ну, пока единственное, что я обнаружил, этоможет «работать», просто создавая растровые файлы и меняя обои снова и снова (я подозреваю, что это будет медленно, как вы упоминали).
Это полноэкранное изображение должно быть где-то в памяти, но тамвозможно, нет способа получить к нему доступ без серьезного взлома памяти низкого уровня.Я буду продолжать искать.
Обновление 2: Это может сработать, но я не уверен:
http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/4af734fb-d2c1-414b-a9f1-759b76692802
В сущности, это так:
HWND p = FindWindow("ProgMan", NULL);
HWND s = FindWindowEx(p, NULL, "SHELLDLL_DefView", NULL);
HWND dtw = FindWindowEx(s, NULL, "SysListView32", NULL);
HDC hdc = GetDC(dtw);
Вы в основном начинаете с окна ProgMan и углубляетесь в обои рабочего стола (я полагаю, "SysListView32").Я собираюсь попробовать это.
Обновление 3: Не пойдет - приведенный выше код получает DC рабочего стола, но он находится над значками, поэтому BitBlt рисует поверх них.Однако он не рисует на экране, потому что я могу рисовать под открытой формой, не закрывая ее, так что, по крайней мере, это прогресс.
Я предполагаю, что есть некое доступное окно, кроме "SysListView32", которое является рабочим столом позади значков, или более одного окна "SysListView32".
Обновление 4: Я почти уверен, что что-то с помощью этого будет работать:
http://msdn.microsoft.com/en-us/library/bb761155(v=VS.85).aspx http://msdn.microsoft.com/en-us/library/bb774742(v=VS.85).aspx
По сути, это метод API, который вы вызываете, передавая структуру, котораявключить дескриптор растрового изображения.Если вызов успешен, это растровое изображение становится рабочим столом.
Предоставляет ли DirectX фреймы в качестве дескрипторов растровых изображений (GDI-совместимых) или только DC?В моем случае моя анимация уже представляет собой массив GDI-совместимых растровых изображений, поэтому у меня не возникло бы проблем с использованием этого подхода.Если это единственный маршрут, и DirectX не предоставляет дескрипторы растрового изображения (и я не думаю, что они это сделают), то для каждого кадра вам нужно будет создать новое растровое изображение GDI, которое значительно замедлит работу.
На самом деле, может быть более простой способ, хотя я не уверен, что это сработает.Как только вы получите указатель на фактическое растровое изображение обоев, вы можете выбрать его в контексте устройства, используя SelectObject
, а затем просто использовать этот контекст устройства в качестве пункта назначения BitBlt.Возможно, вам придется отправить инструкцию по перерисовке на рабочий стол, что может привести к тому, что значки будут перерисовываться каждый раз.
Как насчет работы здесь?:)