Come posso salvare uno screenshot direttamente su un file in Windows? [chiuso]


115

In Windows XP, è possibile premere Alt-PrintScreen per copiare un'immagine della finestra attiva o Ctrl-PrintScreen per copiare un'immagine dell'intero desktop.

Questo può quindi essere incollato in applicazioni che accettano immagini: Photoshop, Microsoft Word, ecc.

Mi chiedo: esiste un modo per salvare lo screenshot direttamente su un file? Devo davvero aprire un programma di immagini, come Paint.net o Photoshop, semplicemente per incollare un'immagine e poi salvarla?


14
Photoshop ?? Perché non usare mspaint o paint.net? Perché usare qualcosa di pesante come Photoshop ??
GEOCHET

1
Il meglio che ho ottenuto qui è stato uno screenshot di Word con uno screenshot di un messaggio di errore incollato direttamente in una mail HTML.
VVS

1
Per favore, dai un'occhiata alla mia risposta, è FINALMENTE possibile farlo almeno con la stessa facilità con cui il Mac (il flusso di Linux è ancora migliore però)
Karthik T

1
Contrassegnato per il passaggio a SuperUser. Sebbene la risposta accettata finisse per essere programmatica, come scritto, questa domanda cercava una risposta generale sull'utilizzo del computer e quindi appartiene a SuperUser.
ArtOfWarfare

1
Ciao, forse è un po 'tardi per la risposta, ma può aiutare gli altri con un problema simile. C'è un'applicazione nel Windows Store con la quale è possibile salvare un'immagine screenshot dagli appunti in un'immagine temporanea su disco e restituire il percorso al file, in modo da poterlo utilizzare con un semplice ctrl + v in qualsiasi applicazione ( microsoft. com / store / apps / 9PM34S06CFVJ ). Non è più necessario aprire altri software per salvare lo screenshot su un file.
Giovanni Esposito

Risposte:


50

Puoi codificare qualcosa di piuttosto semplice che aggancerà PrintScreen e salverà l'acquisizione in un file.

Ecco qualcosa per iniziare a catturare e salvare in un file. Ti basterà agganciare il tasto "Print screen".

using System;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
public class CaptureScreen
{

    static public void Main(string[] args)
    {

        try
        {
            Bitmap capture = CaptureScreen.GetDesktopImage();
            string file = Path.Combine(Environment.CurrentDirectory, "screen.gif");
            ImageFormat format = ImageFormat.Gif;
            capture.Save(file, format);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

    }

    public static Bitmap GetDesktopImage()
    {
        WIN32_API.SIZE size;

        IntPtr  hDC = WIN32_API.GetDC(WIN32_API.GetDesktopWindow()); 
        IntPtr hMemDC = WIN32_API.CreateCompatibleDC(hDC);

        size.cx = WIN32_API.GetSystemMetrics(WIN32_API.SM_CXSCREEN);
        size.cy = WIN32_API.GetSystemMetrics(WIN32_API.SM_CYSCREEN);

        m_HBitmap = WIN32_API.CreateCompatibleBitmap(hDC, size.cx, size.cy);

        if (m_HBitmap!=IntPtr.Zero)
        {
            IntPtr hOld = (IntPtr) WIN32_API.SelectObject(hMemDC, m_HBitmap);
            WIN32_API.BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC, 0, 0, WIN32_API.SRCCOPY);
            WIN32_API.SelectObject(hMemDC, hOld);
            WIN32_API.DeleteDC(hMemDC);
            WIN32_API.ReleaseDC(WIN32_API.GetDesktopWindow(), hDC);
            return System.Drawing.Image.FromHbitmap(m_HBitmap); 
        }
        return null;
    }

    protected static IntPtr m_HBitmap;
}

public class WIN32_API
{
    public struct SIZE
    {
        public int cx;
        public int cy;
    }
    public  const int SRCCOPY = 13369376;
    public  const int SM_CXSCREEN=0;
    public  const int SM_CYSCREEN=1;

    [DllImport("gdi32.dll",EntryPoint="DeleteDC")]
    public static extern IntPtr DeleteDC(IntPtr hDc);

    [DllImport("gdi32.dll",EntryPoint="DeleteObject")]
    public static extern IntPtr DeleteObject(IntPtr hDc);

    [DllImport("gdi32.dll",EntryPoint="BitBlt")]
    public static extern bool BitBlt(IntPtr hdcDest,int xDest,int yDest,int wDest,int hDest,IntPtr hdcSource,int xSrc,int ySrc,int RasterOp);

    [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleBitmap")]
    public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc,  int nWidth, int nHeight);

    [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleDC")]
    public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

    [DllImport ("gdi32.dll",EntryPoint="SelectObject")]
    public static extern IntPtr SelectObject(IntPtr hdc,IntPtr bmp);

    [DllImport("user32.dll", EntryPoint="GetDesktopWindow")]
    public static extern IntPtr GetDesktopWindow();

    [DllImport("user32.dll",EntryPoint="GetDC")]
    public static extern IntPtr GetDC(IntPtr ptr);

    [DllImport("user32.dll",EntryPoint="GetSystemMetrics")]
    public static extern int GetSystemMetrics(int abc);

    [DllImport("user32.dll",EntryPoint="GetWindowDC")]
    public static extern IntPtr GetWindowDC(Int32 ptr);

    [DllImport("user32.dll",EntryPoint="ReleaseDC")]
    public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDc);
}

Aggiorna Ecco il codice per agganciare PrintScreen (e altra chiave) da C #:

Codice gancio


Bei frammenti di codice. Ovviamente dovresti considerare di salvare l'immagine come JPEG o PNG invece che come GIF.
VVS

ImageFormat format = ImageFormat.Gif; puoi semplicemente impostare il formato ImageFormat = ImageFormat.PNG; o ImageFormat format = ImageFormat.JPG; Tutto è qui per te
Patrick Desjardins

4
OK, cosa devo fare con quello snippet? eseguirlo e premere print screen ogni volta che voglio lo screenshot, o solo una volta? oltre a compilarlo?
Jaime Hablutzel

3
Qualcuno aveva un binario?
Timofey Trofimov

2
Non penso che questo sia "abbastanza semplice" ..
hejdav

153

Non c'è modo di salvare direttamente su un file senza uno strumento di terze parti prima di Windows 8. Ecco le mie soluzioni di strumenti di terze parti preferite personali.

Per Windows 8 e versioni successive

Windows Key+ PrintScreen salva lo screenshot in una cartella in<user>/Pictures/Screenshots

Per Windows 7

In Win 7 basta usare lo strumento di cattura: più facilmente accessibile premendo Start, quindi digitando "sni" (invio). o Windows Keyallorasni enter

Versioni precedenti di Windows

Uso la seguente combinazione di tasti per acquisire, quindi salvo utilizzando mspaint. Dopo averlo fatto un paio di volte, ci vogliono solo 2-3 secondi:

  1. Alt+PrintScreen
  2. Win+ R("corri")
  3. digita "mspaint" enter
  4. Ctrl- V(incolla)
  5. Ctrl- S(salva)
  6. usa la finestra di dialogo dei file
  7. Alt- F4(chiudi mspaint)

Inoltre, Cropper è fantastico (e open source). Esegue l'acquisizione di rettangoli su file o appunti ed è ovviamente gratuito.


2
In realtà, questo è sorprendentemente facile e veloce. Inoltre, se stai scattando una serie di scatti, puoi lasciare Paint aperto e usare Ctrl-N per continuare a ripristinare l'area di disegno e Ctrl-S per salvarlo (non è necessario Salva con nome). Un altro vantaggio di mantenere Paint aperto è che ricorda la scelta del formato di file in cui salvare (ad esempio PNG).
Neil Mayhew

1
Grazie @ Neil. Ho aggiornato questa risposta con Ctrl-S e nuove funzionalità di vittoria 7.
TheSoftwareJedi

1
tasto Windows + "sni" FTW!
Jason

Nota che funziona solo per la lingua inglese. Per il polacco lo strumento si chiama Narzędzie Wycinanie e opere analogicamente: Winpoi w, y, enter.
maciek

Non funziona sulla schermata di blocco, quindi non va bene per catturare quei fantastici sfondi di Windows. Molto diverso da Android, che posso catturare uno screenshot di qualsiasi cosa, in qualsiasi momento, inclusa la schermata di blocco.
Triynko

17

Fatto poco noto: nella maggior parte delle finestre di dialogo standard di Windows (XP), puoi premere Ctrl + C per avere una copia testuale del contenuto della finestra di dialogo.
Esempio: apri un file in Blocco note, premi spazio, chiudi la finestra, premi Ctrl + C nella finestra di dialogo Conferma uscita, annulla, incolla in Blocco note il testo della finestra di dialogo.
Non correlato alla tua domanda diretta, ma ho pensato che sarebbe stato bello menzionarlo in questo thread.

Inoltre, in effetti, è necessario un software di terze parti per eseguire lo screenshot, ma non è necessario attivare il grande Photoshop per questo. Qualcosa di gratuito e leggero come IrfanWiew o XnView può fare il lavoro. Uso MWSnap per copiare parti arbitrarie dello schermo. Ho scritto un piccolo script AutoHotkey chiamando le funzioni GDI + per fare screenshot. Eccetera.


Ho appena trovato questo ora. Grazie per il suggerimento.
TankorSmash

Bel suggerimento. A volte sono frustrato dalle finestre di dialogo dei messaggi di errore che non mi consentono di selezionare il testo da copiare. Con questo suggerimento, molti di loro lo fanno! Provalo nel tuo browser qui: jsfiddle.net/liamhennessy/cs3jsj6p
Liam

15

Grazie per tutto il codice sorgente e i commenti - grazie a questo, finalmente ho un'app che volevo :)

Ho compilato alcuni degli esempi e sia i sorgenti che gli eseguibili possono essere trovati qui:

http://sdaaubckp.svn.sourceforge.net/viewvc/sdaaubckp/xp-take-screenshot/

Uso InterceptCaptureScreen.exe: eseguilo semplicemente in un terminale del prompt dei comandi, quindi premi Inserisci quando vuoi catturare uno screenshot (nomi di file con timestamp, png, nella stessa directory in cui si trova l'eseguibile); i tasti verranno catturati anche se il terminale non è a fuoco.

(Uso il tasto Inserisci, poiché dovrebbe avere un tempo più facile propagarsi attraverso, ad esempio, VNC rispetto a PrintScreen, che sul mio laptop richiede che venga premuto anche il tasto Fn e che non si propaga attraverso VNC. Ovviamente, è facile cambiare cosa è la chiave effettiva utilizzata nel codice sorgente).

Spero che questo aiuti, Cheers!


1
Questo programma funziona perfettamente. Estremamente semplice e fa solo ciò che serve.
golmschenk

2
Funziona anche su Windows 7. Per abilitare gli screenshot in un gioco a schermo intero, ho dovuto seguire questi passaggi .
metasequoia

URL guasto. (Non sorprende dopo quasi un decennio.)
Camille Goudeseune

11

Post molto vecchio mi rendo conto, ma Windows finalmente si rese conto di quanto fosse inutile il processo.

In Windows 8.1 (verificato, non funziona in Windows 7 (tnx @bobobobo))

windows key+ prnt screensalva lo screenshot in una cartella in<user>/Pictures/Screenshots

Fonte: http://windows.microsoft.com/en-in/windows/take-screen-capture-print-screen#take-screen-capture-print-screen=windows-8


Non funziona su 7, l'ho appena provato.
bobobobo

@ Bobobobo ah grazie, forse> = Windows 8 allora.
Karthik T

funziona anche su Windows 10. Grazie KarthikT
Usman Hayat Khan

6

Potrei suggerire WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html . Fornisce un'opzione di salvataggio automatico e cattura l'alt + printscreen e altre combinazioni di tasti per catturare schermate, finestre, dialoghi, ecc.


1
Assicurati di controllare le impostazioni per configurarlo esattamente come desideri.
Daniel X Moore

Grazie, stavo cercando un'app che mi permettesse di fare Alt + Printscreen e salvare automaticamente lo screenshot sul desktop. Funziona perfettamente.
Brett

La versione gratuita aggiunge una filigrana e scade dopo 30 giorni. Meh.
Camille Goudeseune

5

Dropbox ora fornisce il gancio per farlo automaticamente. Se ottieni un account Dropbox gratuito e installi l'app per laptop, quando premi PrtScr Dropbox ti darà la possibilità di memorizzare automaticamente tutti gli screenshot nella tua cartella Dropbox.


In realtà ha funzionato e penso che sia il modo più veloce per catturare e salvare lo schermo. Se fosse la mia domanda, la contrassegnerei come accettata.
Muhammad Raheel

2

È necessaria un'utilità di cattura dello schermo di terze parti per quella funzionalità in XP. Apprezzo l'ampio blog di Scott Hanselman sugli strumenti fantastici e di solito cerco lì un'utilità del genere - abbastanza sicuro, ha scritto sul blog di un paio qui .


2

Questo lo farà a Delfi. Notare l'uso della funzione BitBlt, che è una chiamata API di Windows, non qualcosa di specifico di Delphi.

Modifica: aggiunto utilizzo di esempio

function TForm1.GetScreenShot(OnlyActiveWindow: boolean) : TBitmap;
var
  w,h : integer;
  DC : HDC;
  hWin : Cardinal;
  r : TRect;
begin
  //take a screenshot and return it as a TBitmap.
  //if they specify "OnlyActiveWindow", then restrict the screenshot to the
  //currently focused window (same as alt-prtscrn)
  //Otherwise, get a normal screenshot (same as prtscrn)
  Result := TBitmap.Create;
  if OnlyActiveWindow then begin
    hWin := GetForegroundWindow;
    dc := GetWindowDC(hWin);
    GetWindowRect(hWin,r);
    w := r.Right - r.Left;
    h := r.Bottom - r.Top;
  end  //if active window only
  else begin
    hWin := GetDesktopWindow;
    dc := GetDC(hWin);
    w := GetDeviceCaps(DC,HORZRES);
    h := GetDeviceCaps(DC,VERTRES);
  end;  //else entire desktop

  try
    Result.Width := w;
    Result.Height := h;
    BitBlt(Result.Canvas.Handle,0,0,Result.Width,Result.Height,DC,0,0,SRCCOPY);
  finally
    ReleaseDC(hWin, DC) ;
  end;  //try-finally
end;

procedure TForm1.btnSaveScreenshotClick(Sender: TObject);
var
  bmp : TBitmap;
  savdlg : TSaveDialog;
begin
  //take a screenshot, prompt for where to save it
  savdlg := TSaveDialog.Create(Self);
  bmp := GetScreenshot(False);
  try
    if savdlg.Execute then begin
      bmp.SaveToFile(savdlg.FileName);
    end;
  finally
    FreeAndNil(bmp);
    FreeAndNil(savdlg);
  end;  //try-finally
end;



1

Ovviamente potresti scrivere un programma che controlli gli appunti e visualizzi una fastidiosa finestra di dialogo Salva con nome per ogni immagine negli appunti ;-). Immagino che tu possa persino scoprire se l'ultimo tasto premuto è stato PrintScreen per limitare il numero di falsi positivi.

Mentre ci penso .. potresti anche cercare su Google qualcuno che ha già fatto esattamente questo.


EDIT : .. o semplicemente aspetta che qualcuno pubblichi la fonte qui - come è successo :-)


1

Snagit ... molti tecnici lo usano.


perché pagare per uno strumento quando tutto ciò che vuoi è solo fare uno screenshot?
Dane411

1

A parte l'installazione di un programma di cattura dello schermo, che consiglio, il modo migliore per farlo è utilizzare il metodo standard Print Screen, quindi aprire Microsoft Office Picture Manager e incollare semplicemente lo screenshot nell'area bianca della directory che desideri. Creerà una bitmap che puoi modificare o salvare in un formato diverso.


Sebbene questo possa funzionare, è probabile che il richiedente chieda un modo per farlo a livello di codice.
Peter O.

1

Grazie a TheSoftwareJedi per aver fornito informazioni utili sullo strumento di cattura in Windows 7. Collegamento per aprire lo strumento di cattura: vai su Start, digita sni E troverai il nome nell'elenco "Strumento di cattura"

inserisci qui la descrizione dell'immagine


1

Mantieni Picasa in esecuzione in background e fai semplicemente clic sul tasto "Print Screen"

fonte


0

Per quanto ne so in XP, sì, devi usare qualche altra app per salvarlo effettivamente.

Vista viene fornito con lo strumento Snipping, che semplifica un po 'il processo!


0

Si scopre che Google Picasa (gratuito) lo farà per te ora. Se lo hai aperto, quando lo premi salverai la schermata in un file e lo caricherai in Picasa. Nella mia esperienza, funziona benissimo!



-6

È possibile:

  1. Premere Alt PrintScreen
  2. Apri una cartella
  3. Fare clic con il tasto destro -> incolla screenshot

Esempio:

La finestra dei risultati del benchmark è aperta, fai uno screenshot. Apri C: \ Benchmarks Fare clic con il pulsante destro del mouse -> Incolla screenshot Viene visualizzato un file denominato screenshot00x.jpg, con il testo screenshot00x selezionato. Tipo Overclock 5

Questo è tutto. Non c'è bisogno di aprire nulla. Se non scrivi nulla, il nome predefinito rimane.


quale versione di Windows ha una voce di menu "incolla screenshot"? (e con un contenuto degli appunti di tipo immagine non è attivo alcun incolla in win7).
eckes il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.