Así entre tanto código lo que me llama la atención es que utilizas GetDc para obtener un handle, pero no lo liberas usando ReleaseDC cuando ya no lo necesitas. Después de una llamada a GetDc siempre has de llamar a ReleaseDC para liberar ese recurso. Es decir:
Código Delphi
[-]
DeskHw:= Getdesktopwindow;
DeskHdc:= GetDc(deskHw);
ReleaseDC(DeskHw,DeskHdc);