La verdad es que me pierdo entre tanto código. Pero hay algo que me llama la atención:
Código Delphi
[-]
with Desktop1 do Canvas.CopyRect(R,Bitmap1.Canvas,R);
Entiendo que R son las coordenadas donde quieres dibujar el recuadro, pero ten en cuenta el 3 parámetro del método CopyRect es el recuadro de origen y no es el mismo que el de destino como tu indicas (menos cuando es la pantalla completa, por eso te funciona la primera vez). Yo haría algo como esto:
Código Delphi
[-]
with Desktop1 do Canvas.CopyRect(R,Bitmap1.Canvas,Rect(0,0,Bitmap1.Width,Bitmap1.Height));