Я написал программу (к сожалению, сейчас потерянную), чтобы сделать что-то подобное несколько лет назад.
Изображение рабочего стола можно получить, создав DC для экрана, создав совместимое растровое изображение, а затем используя BitBlt
, чтобы скопировать содержимое экрана в растровое изображение. Затем используйте GetDIBits
, чтобы получить пиксели из этого растрового изображения в известном формате.
Эта ссылка не совсем делает это, но демонстрирует принцип, хотя и использует MFC. Я не смог найти пример для Win32:
http://www.flounder.com/screencapture.htm
Для эффекта разрушения лучше всего использовать Direct3D или OpenGL. (Дальнейшие подробности зависят от вас.) Создайте текстуру, используя данные растрового изображения, сохраненные ранее.
Посредством окна для связи с OpenGL или D3D создайте окно без полей, которое заполняет весь экран и не выполняет рисование или стирание фона. Это предотвратит любое мерцание при переключении с изображения рабочего стола на копию изображения рабочего стола, используемого для рисования.
(При использовании D3D вы также найдете GetMonitorInfo
полезным в сочетании с IDirect3D9::GetAdapterMonitor
и друзьями, так как вам нужно будет создать отдельное устройство для каждого монитора, и поэтому вам нужно будет знать, какая часть рабочий стол соответствует этому устройству.)