Di sicuro incrementeresti terribilmente le prestazioni spostando l'acquisizione e il release del DC al di fuori del ciclo... inoltre un altro modo per evitare la Get/SetPixel (che sono notoriamente estremamente lente) sarebbe copiare con una BitBlt il contenuto del buffer dello schermo in una dibsection creata all'avvio del programma, e quindi controllare il contenuto della dibsection accedendo ai pixel direttamente. Resta il fatto che, anche con queste ottimizzazioni, non riuscirai mai ad eseguire l'operazione che dici 1000 volte al secondo, visto che l'analisi di 1280*800=1024000 pixel ti porterà sicuramente via più di 1 msec, e anche se fosse Windows non concederà mai al tuo programma di essere eseguito ogni millisecondo (lo scheduler di Windows assegna la CPU a "quanti" di circa 90 millisecondi, dopo i quali se c'è un altro processo in attesa la CPU viene passata ad esso). Tra l'altro una frequenza del genere è assolutamente senza senso, visto che lo schermo stesso viene ridisegnato tra le 60 e le 85 volte al secondo (a seconda delle impostazioni dello schermo e delle sue caratteristiche), se proprio vuoi fare una cosa del genere avrebbe più senso fare un controllo ogni 20 msec (per quanto io non creda che comunque basti così poco per fare un controllo del genere).
Come al solito in questi casi, dato che la richiesta mi pare senza senso, ti chiedo ulteriori spiegazioni: a cosa ti serve fare una cosa del genere? Probabilmente infatti esiste un modo migliore per farla.