I am implementing a feature that will take screen shot repeatedly and output dirty rectangles between 2 different shots then send re-draw the screen in a window.
For alternative to CopyFromScreen() check this. Note that the Graphics.CopyFromScreen() itself calls the API BitBlt() to copy from screen, you can check the source code using Reflector.