Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - VB.NET- screenshot localizzato
Forum - C# / VB.NET - VB.NET- screenshot localizzato

Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 17:07
Mercoledì, 17/03/2010
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"


walker93 ha allegato un file: screenshot.PNG (1637046 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:08
Mercoledì, 17/03/2010
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).

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 18:39
Mercoledì, 17/03/2010
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
Codice sorgente - presumibilmente VB.NET

  1. Dim p As New Point(0, 0)
  2. Dim im As Graphics
  3. SendKeys.Send(Chr(Keys.Snapshot))
  4. Threading.Thread.Sleep(700)
  5. PictureBox1.PointToScreen(p)
  6. im.DrawImage(Clipboard.GetImage, PictureBox1.Location.X, PictureBox1.Location.Y, PictureBox1.Width, PictureBox1.Height)


ma non funziona

Ultima modifica effettuata da walker93 il 17/03/2010 alle 23:11
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:16
Giovedì, 18/03/2010
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.

Codice sorgente - presumibilmente VB.NET

  1. Dim B As New Bitmap(PictureBox1.Width, PictureBox1.Height)
  2. Dim im As Graphics = Graphics.FromImage(B)
  3. SendKeys.Send(Chr(Keys.Snapshot))
  4. Threading.Thread.Sleep(700)
  5. im.DrawImage(Clipboard.GetImage(), New Rectangle(PictureBox1.PointToScreen(New Point(0, 0)), PictureBox1.Size))
  6. im.Flush()
  7. ' B dovrebbe contenere parte dello schermo


PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 20:41
Giovedì, 18/03/2010
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:
Codice sorgente - presumibilmente VB.NET

  1. SendKeys.Send("%{PRTSC}")
  2.         Application.DoEvents()
  3.         Dim image As Image = Clipboard.GetImage
  4.         Dim g As Graphics = Graphics.FromImage(image)
  5.         PictureBox1.Image = image



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

come adattarlo alla sola picturebox?

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 17:00
Venerdì, 19/03/2010
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
Codice sorgente - presumibilmente VB.NET

  1. Dim rect As Rectangle
  2.     Dim image As Image
  3.     Dim g As Graphics        
  4.         rect = New Rectangle(-5, -20, PictureBox1.Width + 10, PictureBox1.Height + 60)
  5.         SendKeys.Send("%{PRTSC}")
  6.         Application.DoEvents()
  7.         image = Clipboard.GetImage
  8.         g = Graphics.FromImage(image)
  9.         g = PictureBox1.CreateGraphics
  10.         g.DrawImage(image, rect)


PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:54
Sabato, 20/03/2010
Il metodo era Graphics.CopyFromScreen

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 19:51
Lunedì, 22/03/2010
oooook
ho usato:

Codice sorgente - presumibilmente Plain Text

  1. g = PictureBox1.CreateGraphics
  2.           g.CopyFromScreen(PictureBox1.PointToScreen(New Point(0, 0)).X, _
  3.             PictureBox1.PointToScreen(New Point(0, 0)).Y, _
  4.             PictureBox1.PointToScreen(New Point(0, 0)).X + PictureBox1.Width, _
  5.             PictureBox1.PointToScreen(New Point(0, 0)).Y + PictureBox1.Height, _
  6.             PictureBox1.Size)


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

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:12
Martedì, 23/03/2010
La seconda coppia di coordinate indica il punto in cui copiare l'immagine. Tu la stai copiando fuori dalla picturebox (ossia con il vertice superiore sinistro coincidente con il vertice inferiore destro della picturebox), e forse per questo non riesci a vederla.

Al massimo disegna l'immagine su una bitmap e poi impostala come immagine nella picturebox.

PM Quote