web-dev-qa-db-fra.com

Comment enregistrer une capture d'écran directement dans un fichier sous Windows?

Sous Windows XP, on peut appuyer sur Alt-PrintScreen pour copier une image de la fenêtre active ou sur Ctrl-PrintScreen pour copier une image du bureau complet.

Cela peut ensuite être collé dans des applications qui acceptent des images: Photoshop, Microsoft Word, etc.

Je me demande: Est-il possible de sauvegarder la capture d'écran directement dans un fichier? Est ce que je vraiment devez ouvrir un programme d’image, comme Paint.net ou Photoshop, simplement pour coller une image, puis enregistrez-la?

112
David Koelle

Vous pouvez coder quelque chose d'assez simple qui accrochera le PrintScreen et enregistrera la capture dans un fichier.

Voici quelque chose à commencer à capturer et à enregistrer dans un fichier. Il vous suffira d’accrocher la touche "Écran d’impression".

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

Update Voici le code pour connecter le PrintScreen (et une autre clé) à partir de C #:

code de crochet

50

Il n’existe aucun moyen de sauvegarder directement dans un fichier sans un outil tiers avant Windows 8. Voici mes solutions préférées en matière d’outils autres que des tiers.

Pour Windows 8 et versions ultérieures

Windows Key + PrintScreen enregistre la capture d'écran dans un dossier dans <user>/Pictures/Screenshots

Pour Windows 7

Dans win 7, utilisez simplement l’outil de coupure: La plupart du temps est accessible en appuyant sur Démarrer, puis en tapant "sni" (entrée). ou Windows Key ensuite snienter

Anciennes versions de Windows

J'utilise la combinaison de clavier suivante pour capturer, puis enregistrez avec mspaint. Après que vous le fassiez plusieurs fois, cela ne prend que 2-3 secondes:

  1. Alt+PrintScreen
  2. Win+R ("courir")
  3. tapez "mspaint" enter
  4. Ctrl-V (pâte)
  5. Ctrl-S (enregistrer)
  6. utiliser le dialogue de fichier
  7. Alt-F4 (fermer mspaint)

De plus, Cropper est génial (et open source). Il capture en rectangle dans un fichier ou dans le presse-papier, et est bien entendu gratuit.

149
TheSoftwareJedi

Fait peu connu: dans la plupart des boîtes de dialogue Windows (XP) standard, vous pouvez appuyer sur Ctrl + C pour obtenir une copie textuelle du contenu de la boîte de dialogue.
Exemple: ouvrez un fichier dans le Bloc-notes, appuyez sur la touche espace, fermez la fenêtre, appuyez sur Ctrl + C dans la boîte de dialogue Confirmer la sortie, annulez, collez dans le Bloc-notes le texte de la boîte de dialogue.
Sans rapport avec votre question directe, mais je pensais que ce serait bien de le mentionner dans ce fil.

De plus, vous avez besoin d'un logiciel tiers pour faire la capture d'écran, mais vous n'avez pas besoin de lancer le gros Photoshop pour cela. Quelque chose de gratuit et léger comme IrfanWiew ou XnView peut faire le travail. J'utilise MWSnap pour copier des parties arbitraires de l'écran. J'ai écrit un petit script AutoHotkey appelant les fonctions GDI + pour faire des captures d'écran. Etc.

17
PhiLho

Merci pour tout le code source et les commentaires - grâce à cela, j'ai enfin une application que je voulais :)

J'ai compilé certains exemples, et les sources et les exécutables peuvent être trouvés ici:

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

J'utilise InterceptCaptureScreen.exe - il suffit de l'exécuter dans un terminal d'invite de commande, puis d'appuyer sur Insérer lorsque vous souhaitez capturer une capture d'écran (noms de fichier horodatés, png, dans le même répertoire que l'exécutable); les clés seront capturées même si le terminal n'est pas au point.

(J'utilise la touche Insertion, car elle devrait avoir plus de temps pour se propager, par exemple, VNC que PrintScreen - ce qui sur mon ordinateur portable nécessite que la touche Fn soit également enfoncée, et qui ne se propage pas par VNC. Bien sûr, il est facile de changer quoi est la clé utilisée dans le code source).

J'espère que cela aide, à la vôtre!

15
sdaau

Très vieux post, je me rends compte, mais Windows a finalement compris à quel point le processus était insensé.

Sous Windows 8.1 (vérifié, ne fonctionne pas sous Windows 7 (tnx @bobobobo))

windows key + prnt screen enregistre la capture d'écran dans un dossier de <user>/Pictures/Screenshots

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

11
Karthik T

Puis-je suggérer WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html . Il fournit une option d'enregistrement automatique et capture l'alt + printscreen et d'autres combinaisons de touches pour capturer l'écran, les fenêtres, la boîte de dialogue, etc.

6
Jason

Dropbox fournit désormais le moyen de le faire automatiquement. Si vous obtenez un compte Dropbox gratuit et que vous installez l'application pour ordinateur portable, lorsque vous appuyez sur PrtScr, Dropbox vous offre la possibilité de stocker automatiquement toutes les captures d'écran dans votre dossier Dropbox.

5
mwengler

Essayez ceci: http://www.screenshot-utility.com/

De leur page d'accueil:

Lorsque vous appuyez sur une touche de raccourci, elle capture et enregistre un instantané de votre écran dans un fichier JPG, GIF ou BMP.

2
JosephStyons

Cela le fera à Delphes. Notez l'utilisation de la fonction BitBlt, qui est un appel de l'API Windows, pas quelque chose de spécifique à Delphi.

Edit: Ajout d'un exemple d'utilisation

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;
2
JosephStyons

Vous avez besoin d'un utilitaire de capture d'écran tiers pour cette fonctionnalité sous XP. Je Dig Dig's extensive bloguer sur des outils sympas et généralement y chercher un tel utilitaire - bien sûr, il a blogué sur un couple ici .

2
Peter Meyer

Snagit ... beaucoup de techniciens utilisent ça.

1
pearcewg

Laissez Picasa actif en arrière-plan et cliquez simplement sur la touche "Imprimer l'écran".

Source

1
Abilash A

Sans installer un utilitaire de sauvegarde automatique de capture d'écran, oui vous le faites. Il existe plusieurs utilitaires que vous pouvez cependant trouver pour cela.

Par exemple: http://www.screenshot-utility.com/

1
mattlant

À défaut d'installer un programme de capture d'écran, ce que je recommande, la meilleure méthode consiste à utiliser la méthode d'impression d'écran standard, puis à ouvrir Microsoft Office Picture Manager et à simplement coller la capture d'écran dans la zone blanche du répertoire souhaité. Cela créera un bitmap que vous pourrez éditer ou sauvegarder sous un format différent.

1
Mike Kowalczyk

Bien sûr, vous pouvez écrire un programme qui surveille le presse-papiers et affiche une boîte de dialogue SaveAs agaçante pour chaque image du presse-papiers ;-). Je suppose que vous pouvez même savoir si la dernière touche appuyée était PrintScreen pour limiter le nombre de faux positifs.

Pendant que j'y réfléchis ... vous pouvez également rechercher Google qui a déjà fait exactement cela.


EDIT: .. ou attendez que quelqu'un poste la source ici - comme cela vient de se passer :-)

1
VVS

Merci à TheSoftwareJedi d’avoir fourni des informations utiles sur l’outil de capture dans Windows 7. Raccourci pour ouvrir l’outil Capture: Allez dans Démarrer, tapez sni Et vous trouverez le nom dans la liste "Outil Capture"

enter image description here

1
Zahid Rouf

Vous voudrez peut-être quelque chose comme ceci: http://addons.mozilla.org/en-US/firefox/addon/5648

Je pense qu'il existe une version pour IE et aussi avec Explorer Integration. Très bon logiciel.

0
apandit

Il s’avère que Google Picasa (gratuit) le fera pour vous maintenant. Si vous l'avez ouvert, lorsque vous le frapperez, la capture d'écran sera enregistrée dans un fichier et chargée dans Picasa. D'après mon expérience, cela fonctionne très bien!

0
Zach

Autant que je sache dans XP, oui, vous devez utiliser une autre application pour la sauvegarder.

Vista est livré avec l'outil Snipping, qui simplifie un peu le processus!

0
Mitchel Sellers