Рабочий стол DirectX

Я хотел бы сделать анимированный настольный фон для Windows 7 с помощью DirectX. Я использую C#, SlimDX и несколько импорта P/Invoke Windows API functions. Я не великолепен с собственным программированием Windows, но у меня было введение по абсолютному адресу вокруг онлайн, и я верю тому, что я должен сделать, также:

1) Найдите дескриптор окна, содержащего dekstop обои, сцепите его до устройства DirectX и вовлеките его.

2) Сделайте новое окно вывода и вставьте его выше обоев для рабочего стола, но ниже значков на рабочем столе.

Я попробовал обоих они, но ни один, кажется, не работает. Если я перемещаюсь по иерархии Окна, начинающей с дескриптора, возвращенного GetDesktopWindow (), я могу пойти Рабочий стол-> WorkerW-> SHELLDLL_DefView-> SysListView32. Если я поднимаю трубку устройство DirectX к этому дескриптору, я могу дистиллировать весь рабочий стол, но это также покрывает значки. Если я создаю форму Windows, устанавливаю ее родителя на использование SHELLDLL_DefView SetParent () и затем использую SetWindowPos для проигрывания с ее Z-порядком, я, может только казаться, заставляю это идти или позади обоев для рабочего стола или перед рабочим столом + значки.

Выглядит, как будто обои для рабочего стола являются предпосылками к представлению папки, содержащему значки, и поэтому что я пытаюсь сделать, не может работать. Единственное решение затем не состояло бы в том, чтобы использовать рабочий стол для значков, или найти некоторую альтернативу, например, перезапись рабочего стола, затем накладывающего прозрачное окно, содержащее представление содержания некоторой папки.

У кого-либо есть какая-либо идея того, что я должен делать, или даже возможно ли то, что я хочу сделать? Кажется, что можно потянуть к настольному фону с помощью GDI (поскольку я полагаю, что wxSnow программа делает), и я видел что-то подобное тому, что я хочу сделанный VLC Media Player под Windows XP с его режимом обоев DirectX (интересно, я, может казаться, не включаю эту опцию в моей системе).

Спасибо!

19
задан Jonathan 12 April 2010 в 00:44
поделиться

3 ответа

Похоже, это невозможно. См. Эту ссылку:

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/69839cec-3424-4300-9ac3-486b8c2fe492

Если вам нужно нарисовать элементы управления {{ 1}} между фоном рабочего стола и значками рабочего стола, альтернативный шаг ниже:

  1. Создайте пользовательский элемент управления в библиотеке элементов управления Windows.
  2. Встраивать пользовательский элемент управления в элемент управления ActiveX.
  3. Встроить элемент управления ActiveX на веб-страницу.
  4. Включите активный рабочий стол и сделайте веб-страницу фоном рабочего стола .

Это можно сделать только в 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. Однако вам, возможно, придется отправить инструкцию по перерисовке на рабочий стол, что может приводить к тому, что значки будут перерисовываться каждый раз.

Как насчет того, чтобы поработать здесь? :)

5
ответ дан 30 November 2019 в 05:21
поделиться

Я полагаю, что можно получить довольно много кадров в секунду, динамически генерируя растровые изображения и постоянно устанавливая их в качестве фона рабочего стола. Однако это звучит неоправданно (почти глупо) тяжело для CPU. Update: Теперь, когда я думаю об этом (было уже поздно, когда я писал это), основная проблема такого подхода заключается в том, что вам нужно записывать и считывать растровые изображения с жесткого диска каждый раз, когда нужно отобразить новый кадр. Это невыполнимо.

Действительно ли вы используете рабочий стол для значков? В Windows 7 функция поиска в меню "Пуск" и новая панель задач заставили меня отказаться от использования рабочего стола для иконок.

Просто идея

Возможно, можно изменить окно рабочего стола с помощью SendMessage(GetDesktopWindow, WM_SOME_MESSAGE, wParam, lParam), чтобы добиться желаемого. Я могу исследовать это дальше завтра (сейчас 3 часа ночи по местному времени).

1
ответ дан 30 November 2019 в 05:21
поделиться

Я сделал некоторую анимацию альфа-смешанных окон, которые всегда находятся на вершине Z-порядка. Одной из идей может быть игнорирование попыток изменения битовой карты рабочего стола и просто рисование вашего материала как многослойного окна, но управление ZOrder каким-то образом, чтобы оно всегда было самым нижним, нерабочим окном (возможно, стратегически вызывая Form.SendToBack() или что-то еще в нужное время).

В зависимости от того, что вы пытаетесь сделать, это может дать вам тот же эффект анимации рабочего стола.

1
ответ дан 30 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: