Ответ 1
Похоже, это может быть невозможно. См. Эту ссылку:
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/69839cec-3424-4300-9ac3-486b8c2fe492
Если вам нужно нарисовать элементы управления между фоном рабочего стола и значков на рабочем столе, альтернативным шагом является ниже:
- Создайте свой пользовательский элемент управления в библиотеке управления Windows.
- Вставьте элемент управления пользователя в элемент управления ActiveX.
- Вставить элемент управления ActiveX на веб-странице.
- Включить активный рабочий стол и настроить веб-страницу на рабочем столе фон.
Это можно сделать только в XP, поскольку Vista не поддерживает активный рабочий стол.
Другое сообщение там предполагает, что вы могли бы сделать это на фоне окна проводника - если бы вы могли получить дескриптор окна, которое его представляет. Конечно, если это возможно, тогда возможно также получить дескриптор окна рабочего стола за значками.
Обновление: Ну, пока единственная вещь, которую я обнаружил, которая могла бы "работать", - это просто создавать файлы Bitmap и менять обои снова и снова (я подозреваю, что это будет медленным, как вы упомянули).
Полноэкранное изображение должно находиться где-то в памяти, но не может быть доступа к нему без серьезного взлома памяти низкого уровня. Я буду продолжать искать.
Обновление 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. Возможно, вам придется отправить команду repaint на рабочий стол, хотя это может привести к перерисовке значков каждый раз.
Как насчет вас здесь?:)