Dunque, il mio scopo è quello di catturare regolarmente immagini BMP della finestra di un programma esterno al mio, ANCHE QUALORA LA FINESTRA SIA IN SECONDO PIANO, cioè coperta in tutto o in parte da altre finestre.
Il problema, IN TEORIA, si risolve facilmente, noto Hwnd e dimensioni della finestra esterna, definite in una variabile bounds as Rectangle, tramite poche righe di codice utilizzando la API PrintWindow:
codice:
Dim Screenshot As New Bitmap(bounds.Width, bounds.Height, Imaging.PixelFormat.Format32bppArgb)
graph = Graphics.FromImage(Screenshot)
Dim DC As IntPtr = graph.GetHdc()
PrintWindow(Hwnd, DC, 0)
graph.ReleaseHdc()
graph.Dispose()
Image.Save(File, System.Drawing.Imaging.ImageFormat.Bmp)
IN PRATICA, non so per quale motivo, utilizzando questo codice ricorsivamente (catturo uno screenshot ogni mezzo secondo), la finestra originale del programma esterno si riempie random (nel senso di spesso ma non sempre) di "porcherie", nel senso che parti della finestra stessa non si aggiornano e parti si, oppure che se pongo in secondo piano una finestra che la copre parzialmente e metto in primo piano la finestra che mi interessa, in quest' ultima finestra rimane "impressa" la parte dell' altra finestra che ho messo in secondo piano per una decina di secondi e più, rendendo inutile la sua cattura.
Insomma, mi sembra che la API non solo catturi la finestra, ma crei anche molti problemi alla sua visualizzazione grafica così come si presenta sul desktop.
Ho notato che premendo e ripremendo velocemente il pulsante Desktop la finestra si ripulisce perfettmente, ma non posso ricorrere a questo sistema ogni mezzo secondo, lo sfarfallio mi rovinerebbe la vista in 10 minuti.
A questo punto la domanda è: come ovviare all' inconveniente e far si che soltanto la mia finestra di target rimanga sempre bella pulita ed aggiornata?