¿Cómo puedo guardar una captura de pantalla directamente en un archivo en Windows? [cerrado]


115

En Windows XP, se puede presionar Alt-PrintScreen para copiar una imagen de la ventana activa, o Ctrl-PrintScreen para copiar una imagen del escritorio completo.

Esto luego se puede pegar en aplicaciones que acepten imágenes: Photoshop, Microsoft Word, etc.

Me pregunto: ¿Hay alguna forma de guardar la captura de pantalla directamente en un archivo? ¿ Realmente tengo que abrir un programa de imágenes, como Paint.net o Photoshop, simplemente para pegar una imagen y luego guardarla?


14
Photoshop ?? ¿Por qué no utilizar mspaint o paint.net? ¿Por qué usar algo tan pesado como Photoshop?
GEOCHET

1
Lo mejor que obtuve aquí fue una captura de pantalla de Word con una captura de pantalla de algún mensaje de error pegado directamente en un correo HTML.
VVS

1
Por favor, eche un vistazo a mi respuesta, FINALMENTE es posible hacerlo al menos tan fácilmente como Mac (sin embargo, Linux fluye mejor)
Karthik T

1
Marcado para movimiento a SuperUser. Aunque la respuesta aceptada terminó siendo programática, como está escrita, esta pregunta buscaba una respuesta de uso general de la computadora y, por lo tanto, pertenece a SuperUser.
ArtOfWarfare

1
Hola, tal vez sea un poco tarde para la respuesta, pero puede ayudar a otros con un problema similar. Existe una aplicación en la tienda de Windows con la que puedes guardar una imagen de captura de pantalla del portapapeles en una imagen temporal en el disco y devolver la ruta al archivo, para que puedas usarlo con un simple ctrl + v en cualquier aplicación ( microsoft. com / store / apps / 9PM34S06CFVJ ). Ya no necesitaría abrir otro software para guardar la captura de pantalla en un archivo.
Giovanni Esposito

Respuestas:


50

Puede codificar algo bastante simple que enganche PrintScreen y guarde la captura en un archivo.

Aquí hay algo para comenzar a capturar y guardar en un archivo. Solo necesitará enganchar la tecla "Imprimir pantalla".

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);
}

Actualizar Aquí está el código para conectar PrintScreen (y otra tecla) desde C #:

Código de gancho


Bonitos fragmentos de código. Por supuesto, debería considerar guardar la imagen como JPEG o PNG en lugar de GIF.
VVS

Formato ImageFormat = ImageFormat.Gif; simplemente puede configurar ImageFormat format = ImageFormat.PNG; o formato ImageFormat = ImageFormat.JPG; Todo está aquí para ti
Patrick Desjardins

4
De acuerdo, ¿qué debo hacer con ese fragmento? ejecutarlo y presionar imprimir pantalla cada vez que quiera la captura de pantalla, o solo una vez? además de compilarlo?
Jaime Hablutzel

3
¿Alguien tenía un binario?
Timofey Trofimov

2
No creo que esto sea "bastante simple" ..
hejdav

153

No hay forma de guardar directamente en un archivo sin una herramienta de terceros antes de Windows 8. Aquí están mis soluciones de herramientas favoritas que no son de terceros.

Para Windows 8 y posteriores

Windows Key+ PrintScreen guarda la captura de pantalla en una carpeta en<user>/Pictures/Screenshots

Para Windows 7

En win 7, simplemente use la herramienta de recortes: se accede más fácilmente presionando Inicio, luego escribiendo "sni" (ingresar). o Windows Keyluegosni enter

Versiones anteriores de Windows

Utilizo la siguiente combinación de teclado para capturar y luego guardar usando mspaint. Después de hacerlo un par de veces, solo toma 2-3 segundos:

  1. Alt+PrintScreen
  2. Win+ R("correr")
  3. escriba "mspaint" enter
  4. Ctrl- V(pegar)
  5. Ctrl- S(guardar)
  6. usar diálogo de archivo
  7. Alt- F4(cerrar mspaint)

Además, Cropper es genial (y de código abierto). Realiza capturas de rectángulos en archivos o portapapeles y, por supuesto, es gratis.


2
De hecho, esto es sorprendentemente rápido y fácil. Además, si está tomando una serie de disparos, puede dejar Paint abierto y usar Ctrl-N para seguir restableciendo el área de pintura y Ctrl-S para guardarlo (no es necesario Guardar como). Otra ventaja de mantener Paint abierto es que recuerda su elección de formato de archivo para guardar (por ejemplo, PNG).
Neil Mayhew

1
Gracias @Neil. Actualicé esta respuesta con Ctrl-S y las nuevas funciones de win 7.
TheSoftwareJedi

1
tecla de Windows + "sni" FTW!
Jason

Tenga en cuenta que solo funciona para la configuración regional en inglés. Para polaca la herramienta se llama Narzędzie Wycinanie y obras analógicamente: Wina continuación w, y, enter.
maciek

No funciona en la pantalla de bloqueo, por lo que no sirve para capturar esos fondos geniales de Windows. Muy diferente a Android, que puedo capturar una captura de pantalla de cualquier cosa, en cualquier momento, incluida la pantalla de bloqueo.
Triynko

17

Dato poco conocido: en la mayoría de los cuadros de diálogo estándar de Windows (XP), puede presionar Ctrl + C para tener una copia textual del contenido del cuadro de diálogo.
Ejemplo: abra un archivo en el Bloc de notas, presione el espacio, cierre la ventana, presione Ctrl + C en el cuadro de diálogo Confirmar salida, cancele, pegue en el Bloc de notas el texto del cuadro de diálogo.
No relacionado con su pregunta directa, pero pensé que sería bueno mencionarlo en este hilo.

Además, de hecho, necesita un software de terceros para hacer la captura de pantalla, pero no necesita disparar el gran Photoshop para eso. Algo gratuito y ligero como IrfanWiew o XnView puede hacer el trabajo. Utilizo MWSnap para copiar partes arbitrarias de la pantalla. Escribí un pequeño script de AutoHotkey llamando a funciones GDI + para hacer capturas de pantalla. Etc.


Acabo de encontrar esto ahora. Gracias por ese consejo.
TankorSmash

Buen consejo. A veces me frustran los cuadros de diálogo de mensajes de error que no me permiten seleccionar texto para copiar. Con este consejo, ¡muchos lo hacen! Pruébelo en su navegador aquí: jsfiddle.net/liamhennessy/cs3jsj6p
Liam

15

Gracias por todo el código fuente y los comentarios; gracias a eso, finalmente tengo una aplicación que quería :)

He compilado algunos de los ejemplos, y tanto las fuentes como los ejecutables se pueden encontrar aquí:

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

Yo uso InterceptCaptureScreen.exe - simplemente ejecútelo en una terminal de símbolo del sistema y luego presione Insertar cuando desee capturar una captura de pantalla (nombres de archivo con marca de tiempo, png, en el mismo directorio donde está el ejecutable); Las teclas se capturarán incluso si el terminal no está enfocado.

(Yo uso la tecla Insertar, ya que debería ser más fácil propagarse a través de, digamos, VNC que PrintScreen, que en mi computadora portátil requiere que también se presione la tecla Fn, y eso no se propaga a través de VNC. Por supuesto, es fácil cambiar lo que es la clave real utilizada en el código fuente).

Espero que esto ayude, ¡Salud!


1
Este programa funciona perfectamente. Extremadamente simple y hace justo lo que se necesita.
golmschenk

2
También funciona en Windows 7. Para habilitar capturas de pantalla en un juego de pantalla completa, tuve que seguir estos pasos .
metasequoia

URL muerta. (No es sorprendente después de casi una década.)
Camille Goudeseune

11

Me doy cuenta de una publicación muy antigua, pero Windows finalmente se dio cuenta de lo estúpido que era el proceso.

En Windows 8.1 (verificado, no funciona en Windows 7 (tnx @bobobobo))

windows key+ prnt screenguarda la captura de pantalla en una carpeta en<user>/Pictures/Screenshots

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


No funciona en 7, solo lo probé.
bobobobo

@bobobobo ah gracias, tal vez> = Windows 8 entonces.
Karthik T

también funciona en Windows 10. Gracias KarthikT
Usman Hayat Khan

6

¿Puedo sugerir WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html . Proporciona una opción de guardado automático y captura la pantalla de impresión alt + y otras combinaciones de teclas para capturar pantalla, ventanas, diálogo, etc.


1
Asegúrese de verificar la configuración para configurarlo exactamente como lo desea.
Daniel X Moore

Gracias, estaba buscando una aplicación que me permitiera hacer Alt + Imprimir pantalla y guardar automáticamente la captura de pantalla en el escritorio. Esto funciona perfectamente.
Brett

La versión gratuita agrega una marca de agua y caduca después de 30 días. Meh.
Camille Goudeseune

5

Dropbox ahora proporciona el gancho para hacer esto automágicamente. Si obtiene una cuenta de Dropbox gratuita e instala la aplicación para computadora portátil, cuando presione PrtScr, Dropbox le dará la opción de almacenar automáticamente todas las capturas de pantalla en su carpeta de Dropbox.


Esto realmente funcionó y creo que es la forma más rápida de capturar y guardar la pantalla. Si fuera mi pregunta, la marcaría como aceptada.
Muhammad Raheel

2

Necesita una utilidad de captura de pantalla de terceros para esa funcionalidad en XP. Me encantan los extensos blogs de Scott Hanselman sobre herramientas geniales y, por lo general, busco allí una utilidad de este tipo; efectivamente, él escribió en un blog sobre un par aquí .


2

Esto lo hará en Delphi. Tenga en cuenta el uso de la función BitBlt, que es una llamada a la API de Windows, no algo específico de Delphi.

Editar: uso de ejemplo agregado

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

Sin instalar una utilidad de guardado automático de captura de pantalla, sí lo hace. Hay varias utilidades que puede encontrar sin embargo después de hacer esto.

Por ejemplo: http://www.screenshot-utility.com/


Oh, lástima que sea antiguo. Última actualización en 2001.
isaaclw

1

Por supuesto, podría escribir un programa que supervise el portapapeles y muestre un molesto cuadro de diálogo Guardar como para cada imagen del portapapeles ;-). Supongo que incluso puede averiguar si la última tecla presionada fue PrintScreen para limitar el número de falsos positivos.

Mientras lo pienso ... también puedes buscar en Google para alguien que ya hizo exactamente eso.


EDITAR : .. o simplemente esperar a que alguien publique la fuente aquí, como acaba de suceder :-)


1

Snagit ... mucha gente de tecnología usa eso.


¿Por qué pagar por una herramienta cuando todo lo que desea es tomar una captura de pantalla?
Dane411

1

Aparte de instalar un programa de captura de pantalla, que recomiendo, la mejor manera de hacerlo es utilizando el método estándar Imprimir pantalla, luego abra Microsoft Office Picture Manager y simplemente pegue la captura de pantalla en el área blanca del directorio que desee. Creará un mapa de bits que puede editar o guardar como un formato diferente.


Aunque esto puede funcionar, es probable que el autor de la pregunta esté solicitando una forma de hacerlo mediante programación.
Peter O.1 de

1

Gracias a TheSoftwareJedi por proporcionar información útil sobre la herramienta de ajuste en Windows 7. Acceso directo para abrir la herramienta de recorte: vaya a Inicio, escriba sni Y encontrará el nombre en la lista "Herramienta de recorte"

ingrese la descripción de la imagen aquí


1

Mantenga Picasa ejecutándose en segundo plano y simplemente haga clic en la tecla "Imprimir pantalla"

Fuente


0

Por lo que sé en XP, sí, debes usar alguna otra aplicación para guardarla.

Vista viene con la herramienta Recortes, que simplifica un poco el proceso.


0

Resulta que Google Picasa (gratuito) hará esto por ti ahora. Si lo tiene abierto, cuando lo presione guardará la captura de pantalla en un archivo y lo cargará en Picasa. En mi experiencia, ¡funciona muy bien!



-6

Es posible:

  1. Presione Alt PrintScreen
  2. Abrir una carpeta
  3. Clic derecho -> pegar captura de pantalla

Ejemplo:

La ventana de resultados de referencia está abierta, tome una captura de pantalla. Abra C: \ Benchmarks Haga clic derecho -> Pegar captura de pantalla Aparece un archivo llamado screenshot00x.jpg, con el texto screenshot00x seleccionado. Tipo Overclock5

Eso es. No es necesario abrir nada. Si no escribe nada, el nombre predeterminado permanece.


¿Qué versión de Windows tiene una entrada de menú "pegar captura de pantalla"? (y con un contenido de portapapeles de tipo imagen no hay pegado activado en win7).
eckes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.