Como posso salvar uma captura de tela diretamente em um arquivo no Windows? [fechadas]


115

No Windows XP, pode-se pressionar Alt-PrintScreen para copiar uma imagem da janela ativa ou Ctrl-PrintScreen para copiar uma imagem de toda a área de trabalho.

Isso pode ser colado em aplicativos que aceitam imagens: Photoshop, Microsoft Word, etc.

Estou pensando: existe uma maneira de salvar a captura de tela diretamente em um arquivo? Eu realmente preciso abrir um programa de imagem, como Paint.net ou Photoshop, simplesmente para colar uma imagem e salvá-la?


14
Photoshop ?? Por que não usar mspaint ou paint.net? Por que usar algo tão pesado quanto o photoshop ??
GEOCHET

1
O melhor que consegui aqui foi uma captura de tela do word com uma captura de tela de alguma mensagem de erro colada diretamente em um e-mail em HTML.
VVS

1
Por favor, dê uma olhada na minha resposta, é FINALMENTE possível fazer isso pelo menos tão facilmente quanto o Mac (o fluxo do Linux ainda é melhor)
Karthik T

1
Sinalizado para movimentação para SuperUser. Embora a resposta aceita acabasse sendo programática, da forma como está escrita, essa questão procurava uma resposta geral para o uso do computador e, portanto, pertence ao SuperUser.
ArtOfWarfare

1
Olá, talvez seja um pouco tarde para a resposta, mas pode ajudar outras pessoas com um problema semelhante. Existe um aplicativo na Windows Store com o qual você pode salvar uma imagem da tela da área de transferência em uma imagem temporária no disco e retornar o caminho para o arquivo, para que você possa usá-lo com um simples ctrl + v em qualquer aplicativo ( microsoft. com / store / apps / 9PM34S06CFVJ ). Você não precisaria mais abrir outro software para salvar a captura de tela em um arquivo.
Giovanni Esposito

Respostas:


50

Você pode codificar algo bem simples que conectará o PrintScreen e salvará a captura em um arquivo.

Aqui está algo para começar a capturar e salvar em um arquivo. Você só precisa enganchar a tecla "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);
}

Atualizar Aqui está o código para conectar o PrintScreen (e outra chave) do C #:

Código de gancho


Trechos de código legais. Claro que você deve considerar salvar a imagem como JPEG ou PNG em vez de GIF.
VVS

ImageFormat format = ImageFormat.Gif; você pode apenas definir ImageFormat format = ImageFormat.PNG; ou ImageFormat format = ImageFormat.JPG; Tudo está aqui para você
Patrick Desjardins

4
OK, o que devo fazer com esse snippet? execute-o e pressione imprimir tela toda vez que quiser a captura de tela ou apenas uma vez? além de compilá-lo?
Jaime Hablutzel

3
Alguém tinha um binário?
Timofey Trofimov

2
Eu não acho que isso seja "muito simples" ..
hejdav

153

Não há como salvar diretamente em um arquivo sem uma ferramenta de terceiros antes do Windows 8. Aqui estão minhas soluções de ferramentas de terceiros preferidas.

Para Windows 8 e posterior

Windows Key+ PrintScreen salva a captura de tela em uma pasta em<user>/Pictures/Screenshots

Para Windows 7

No win 7, basta usar a ferramenta de recorte: acessada mais facilmente pressionando Iniciar e digitando "sni" (enter). ou Windows Keyentãosni enter

Versões anteriores do Windows

Eu uso a seguinte combinação de teclado para capturar e, em seguida, salvo usando mspaint. Depois de fazer isso algumas vezes, leva apenas 2-3 segundos:

  1. Alt+PrintScreen
  2. Win+ R("correr")
  3. digite "mspaint" enter
  4. Ctrl- V(colar)
  5. Ctrl- S(salvar)
  6. usar diálogo de arquivo
  7. Alt- F4(fechar mspaint)

Além disso, Cropper é ótimo (e de código aberto). Ele captura retângulo para arquivo ou área de transferência e, claro, é gratuito.


2
Na verdade, isso é surpreendentemente rápido e fácil. Além disso, se estiver tirando uma série de fotos, você pode deixar o Paint aberto e usar Ctrl-N para continuar redefinindo a área de pintura e Ctrl-S para salvá-la (não há necessidade de Salvar como). Outra vantagem de manter o Paint aberto é que ele lembra sua escolha do formato de arquivo no qual salvar (por exemplo, PNG).
Neil Mayhew

1
Obrigado @Neil. Eu atualizei esta resposta com o Ctrl-S e novos recursos do win 7.
TheSoftwareJedi

1
tecla do windows + "sni" FTW!
Jason

Observe que isso funciona apenas para o idioma inglês. Para polonês a ferramenta é nomeado Narzędzie Wycinanie e obras analogicamente: Winentão w, y, enter.
maciek

Não funciona na tela de bloqueio, então não é bom para capturar aqueles fundos de janelas legais. Muito diferente do Android, em que posso capturar imagens de qualquer coisa, a qualquer hora, incluindo a tela de bloqueio.
Triynko,

17

Fato pouco conhecido: na maioria das caixas de diálogo padrão do Windows (XP), você pode pressionar Ctrl + C para obter uma cópia textual do conteúdo da caixa de diálogo.
Exemplo: abra um arquivo no Bloco de Notas, pressione a tecla Espaço, feche a janela, pressione Ctrl + C na caixa de diálogo Confirmar Saída, cancele, cole no Bloco de Notas o texto da caixa de diálogo.
Não relacionado à sua pergunta direta, mas achei que seria bom mencionar neste tópico.

Além disso, você precisa de um software de terceiros para fazer a captura de tela, mas não precisa disparar o grande Photoshop para isso. Algo gratuito e leve como IrfanWiew ou XnView pode fazer o trabalho. Eu uso o MWSnap para copiar partes arbitrárias da tela. Eu escrevi um pequeno script AutoHotkey chamando funções GDI + para fazer capturas de tela. Etc.


Só encontrei isso agora. Obrigado por essa dica.
TankorSmash

Boa dica. Às vezes, fico frustrado com os diálogos de mensagens de erro que não me permitem selecionar o texto a ser copiado. Com essa dica, muitos deles fazem! Experimente em seu navegador aqui: jsfiddle.net/liamhennessy/cs3jsj6p
Liam

15

Obrigado por todo o código-fonte e comentários - graças a isso, finalmente tenho um aplicativo que queria :)

Compilei alguns dos exemplos e as fontes e os executáveis ​​podem ser encontrados aqui:

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

Eu uso InterceptCaptureScreen.exe - simplesmente execute-o em um terminal de prompt de comando e pressione Insert quando quiser capturar uma imagem (nomes de arquivo com carimbo de data / hora, png, no mesmo diretório onde está o executável); as chaves serão capturadas mesmo se o terminal não estiver em foco.

(Eu uso a tecla Insert, uma vez que deve ter mais facilidade de propagação através de, digamos, VNC do que PrintScreen - que no meu laptop requer que a tecla Fn seja pressionada, e isso não se propaga através de VNC. Claro, é fácil mudar o que é a chave real usada no código-fonte).

Espero que isso ajude, Cheers!


1
Este programa funciona perfeitamente. Extremamente simples e faz apenas o que é necessário.
golmschenk

2
Funciona no Windows 7 também. Para habilitar as capturas de tela em um jogo em tela cheia, tive que seguir estas etapas .
metasequoia

URL morto. (Não é surpreendente depois de quase uma década.)
Camille Goudeseune

11

Postagem muito antiga, eu percebo, mas o Windows finalmente percebeu o quão fútil era o processo.

No Windows 8.1 (verificado, não funciona no Windows 7 (tnx @bobobobo))

windows key+ prnt screensalva a captura de tela em uma pasta em<user>/Pictures/Screenshots

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


Não funciona no 7, eu apenas tentei.
bobobobo

@bobobobo ah obrigado, talvez> = windows 8 então.
Karthik T de

seu trabalho no windows 10 também. Obrigado KarthikT
Usman Hayat Khan

6

Posso sugerir WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html . Ele oferece uma opção de salvamento automático e captura alt + printscreen e outras combinações de teclas para capturar tela, janelas, diálogo, etc.


1
Certifique-se de verificar as configurações para configurá-lo exatamente como você deseja.
Daniel X Moore

Obrigado, estava procurando por um aplicativo que me permitisse fazer Alt + Printscreen e salvar automaticamente a captura de tela no desktop. Isso funciona perfeitamente.
Brett,

A versão gratuita adiciona uma marca d'água e expira após 30 dias. Meh.
Camille Goudeseune

5

O Dropbox agora fornece o gancho para fazer isso de forma automática e mágica. Se você obtiver uma conta de caixa de depósito gratuita e instalar o aplicativo para laptop, ao pressionar PrtScr, o Dropbox lhe dará a opção de armazenar automaticamente todas as capturas de tela em sua pasta de caixa de depósito.


Isso realmente funcionou e acho que é a maneira mais rápida de capturar e salvar a tela. Se fosse minha pergunta, eu marcaria como aceita.
Muhammad Raheel


2

Isso vai fazer isso em Delphi. Observe o uso da função BitBlt, que é uma chamada de API do Windows, não algo específico para Delphi.

Editar: Adicionado exemplo de uso

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

Sem instalar um utilitário de salvamento automático de captura de tela, sim, você faz. Existem vários utilitários que você pode encontrar, no entanto, antes de fazer isso.

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


Que pena que é antigo. Última atualização em 2001.
isaaclw 01 de

1

Claro que você poderia escrever um programa que monitora a área de transferência e exibe um diálogo Salvar como irritante para cada imagem na área de transferência ;-). Acho que você pode até descobrir se a última tecla pressionada foi PrintScreen para limitar o número de falsos positivos.

Enquanto estou pensando sobre isso ... você também pode pesquisar no Google por alguém que já fez exatamente isso.


EDITAR : .. ou apenas esperar que alguém poste a fonte aqui - como acabou de acontecer :-)


1

Snagit ... muitas pessoas de tecnologia usam isso.


por que pagar por uma ferramenta quando tudo que você quer é apenas tirar uma captura de tela?
Dane411

1

Sem instalar um programa de captura de tela, o que eu recomendo, a melhor maneira de fazer isso é usando o método Print Screen padrão, abra o Microsoft Office Picture Manager e simplesmente cole a captura de tela na área branca do diretório que você deseja. Isso criará um bitmap que você pode editar ou salvar em um formato diferente.


Embora isso possa funcionar, o autor da pergunta provavelmente está pedindo uma maneira de fazer isso programaticamente.
Peter O.

1

Obrigado ao TheSoftwareJedi por fornecer informações úteis sobre a ferramenta de captura no Windows 7. Atalho para abrir a ferramenta de captura: Vá em Iniciar, digite sni E você encontrará o nome na lista "Ferramenta de captura"

insira a descrição da imagem aqui


1

Mantenha o Picasa em execução em segundo plano e simplesmente clique na tecla "Print Screen"

Fonte


0

Pelo que eu sei no XP, sim, você deve usar algum outro aplicativo para salvá-lo.

O Vista vem com a ferramenta Snipping, que simplifica um pouco o processo!


0

Acontece que o Google Picasa (gratuito) fará isso por você agora. Se estiver aberto, quando você clicar nele, a captura de tela será salva em um arquivo e carregada no Picasa. Na minha experiência, funciona muito bem!



-6

Isso é possível:

  1. Pressione Alt PrintScreen
  2. Abra uma pasta
  3. Clique com o botão direito -> colar captura de tela

Exemplo:

A janela de resultados do benchmark está aberta, faça uma captura de tela. Abra C: \ Benchmarks Clique com o botão direito -> Colar captura de tela Um arquivo chamado screenshot00x.jpg aparece, com o texto screenshot00x selecionado. Digite Overclock5

É isso aí. Não há necessidade de abrir nada. Se você não escrever nada, o nome padrão permanece.


qual versão do Windows tem uma entrada de menu "colar captura de tela"? (e com um conteúdo da área de transferência do tipo imagem, não há colar ativado no win7).
eckes
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.