GetDesktopWindow, GetDC, BitBlt. С помощью GetDesktopWindow получаем дескриптор десктопа, потом с помощью GetDC - получаем дескриптор DC, после чего копируем с помощью BitBlt.
у меня вопрос по этой теме вот код процедуры, рисующей шарики случайного цвета и размера (до заданного), хочу сделать это как скринсейвер, но я хочу, чтобы всё это художество вылезало прямо на окна, то есть на копию экрана, чтобы после нажатия клавиши это можно было удалить. При рисовании битмепа посторонним канвасом вылетает ошибка canvas does not allow drawning Вот кусок кода модуля: Код (Text): procedure Jeans(struct:pointer); Var Ifcol:boolean; r:TRect; X, Y: Integer; size,sizelimit,time:cardinal; col:TColor; begin randomize; with PScreenJoke(struct)^ do ///это моя структура с параметрами скринсейвера begin Ifcol:=AllColors; sizelimit:=LimitOfSize+1; if OneSize then size:=sizelimit; if not ifcol then col:=ParticularColor; time:=Wait; end; bit:=TBitmap.Create; ///Это всё глобальные переменные, они дестроятся потом при завершении потока c:=TCanvas.Create; d:=TCanvas.Create; SX:=GetSystemMetrics(0); SY:=GetSystemMetrics(1); bit.Width:=SX; bit.Height:=SY; DC:=GetDC(0); c.Handle:=DC; {i f not BitBlt(bit.Canvas.Handle,0,0,SX,SY,DC,0,0,SRCCopy) then MessageBox(0,'Drawning in this way is not allowed','Error',MB_ICONERROR); c.Handle:=GetDC(0); Просто по-разному уже пробовал } r:=Rect(0,0,SX,SY); bit.Canvas.CopyRect(r,c,r); c.Free; if not ifcol then bit.Canvas.Brush.Color:=col; repeat X := Random (SX); Y := Random (SY); if size<>sizelimit then size:=Random(sizelimit); if ifcol then bit.Canvas.Brush.Color:=colors[random(22)]; bit.Canvas.Ellipse(X - size, Y - size, X + size, Y + size); d.Draw(0,0,bit); ///после этого вылетает ошибка sleep(time); until false; end; жду ваших советов