Oppure

Loading
17/03/10 16:07
walker93
ciao a tutti.
avrei la neccessità di fare uno screenshot,ma non di tutto il monitor solo di un pezzo
nel dettaglio:
ho una form con una picturebox e un bottone
la form ha la proprietà trasparencykey impostata su un colore
la picturebox ha la proprietà backcolor impostata sullo stesso colore senza nessuna immagine, quindi vedo dentro alla picturebox quello che sta dietro alla form(come nell'immagine)
a me servirebbe di fare lo screenshot solo della picturebox per catturare quello che ne viene "mostrato"
aaa
17/03/10 17:08
Il Totem
C'era un metodo che permetteva di catturare porzioni di schermo, ma al momento non riesco proprio a ricordare quale sia o dove si trovi. Nel peggiore dei casi, puoi effettuare una print screen, che ti salva l'immagine nella clipboard, quindi ottenere tutta l'immagine (Clipboard.GetImage) e usare Graphics.DrawImage per trasportarne una parte in un'altra immagine vuota.
Ricorda che le coordinate della PictureBox sono relative al form. Per trasformarle in coordinate assolute relative allo schermo devi usare PictureBox.PointToScreen(New Point(0,0)) (questo restituisce le coordinate del vertice superiore sinistro della picturebox rispetto allo schermo).
aaa
17/03/10 17:39
walker93
beh grazie per la risposta...
se ti viene in mente il metodo per le porzioni penso sia molto più semplice
perchè io adesso ho usato
Dim p As New Point(0, 0)
Dim im As Graphics
SendKeys.Send(Chr(Keys.Snapshot))
Threading.Thread.Sleep(700)
PictureBox1.PointToScreen(p)
im.DrawImage(Clipboard.GetImage, PictureBox1.Location.X, PictureBox1.Location.Y, PictureBox1.Width, PictureBox1.Height)

ma non funziona
Ultima modifica effettuata da walker93 17/03/10 22:11
aaa
18/03/10 19:16
Il Totem
im non è inizializzata, quindi non stai usando nessun oggetto Graphics.
im non è associata ad un'immagine, quindi anche se contenesse un oggetto valido, non produrrebbe alcun output.
PointToScreen è una FUNZIONE, come si legge chiaramento sia dalla documentazione sia dall'intellisense. Tu la stai usando come una procedura. Tutto quello che una funzione fa è produrre un valore, e tu ignori palesemente quel valore, quindi è inutile.

Dim B As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim im As Graphics = Graphics.FromImage(B)
SendKeys.Send(Chr(Keys.Snapshot))
Threading.Thread.Sleep(700)
im.DrawImage(Clipboard.GetImage(), New Rectangle(PictureBox1.PointToScreen(New Point(0, 0)), PictureBox1.Size))
im.Flush()
' B dovrebbe contenere parte dello schermo
aaa
18/03/10 19:41
walker93
il tuo codice mi da errore:

System.ArgumentNullException non è stata gestita
Message="Il valore non può essere null. Nome parametro: image"

ho provato con questo:
        SendKeys.Send("%{PRTSC}")
        Application.DoEvents()
        Dim image As Image = Clipboard.GetImage
        Dim g As Graphics = Graphics.FromImage(image)
        PictureBox1.Image = image


questo fa bene l'immagine senza errori ma di tutta la form e non della picturebox

come adattarlo alla sola picturebox?
aaa
19/03/10 16:00
walker93
con questo codice ottengo buoni risultati solo che non appena ridimensiono la form
(e anche la picture box con la prop. anchor) si svuota la picturebox e non riesco a salvarel'immagine
    Dim rect As Rectangle
    Dim image As Image
    Dim g As Graphics        
        rect = New Rectangle(-5, -20, PictureBox1.Width + 10, PictureBox1.Height + 60)
        SendKeys.Send("%{PRTSC}")
        Application.DoEvents()
        image = Clipboard.GetImage
        g = Graphics.FromImage(image)
        g = PictureBox1.CreateGraphics
        g.DrawImage(image, rect)
aaa
20/03/10 14:54
Il Totem
Il metodo era Graphics.CopyFromScreen
aaa
22/03/10 18:51
walker93
oooook
ho usato:

    g = PictureBox1.CreateGraphics
          g.CopyFromScreen(PictureBox1.PointToScreen(New Point(0, 0)).X, _
            PictureBox1.PointToScreen(New Point(0, 0)).Y, _
            PictureBox1.PointToScreen(New Point(0, 0)).X + PictureBox1.Width, _
            PictureBox1.PointToScreen(New Point(0, 0)).Y + PictureBox1.Height, _
            PictureBox1.Size)

ma come visualizzarlo nella picturebox??
copyfromscreen non restituisce un valore
aaa