it-swarm.com.de

Wie kann ich einen Screenshot direkt in einer Datei in Windows speichern?

Unter Windows XP können Sie Alt-PrintScreen drücken, um ein Bild des aktiven Fensters zu kopieren, oder Strg-PrintScreen, um ein Bild des gesamten Desktops zu kopieren.

Dies kann dann in Anwendungen eingefügt werden, die Bilder akzeptieren: Photoshop, Microsoft Word usw.

Ich frage mich: Gibt es eine Möglichkeit, den Screenshot direkt in einer Datei zu speichern? Mache ich ja wirklich Müssen Sie ein Bildprogramm wie Paint.net oder Photoshop öffnen, um ein Bild einzufügen, und es dann speichern?

112
David Koelle

Sie können etwas ziemlich Einfaches programmieren, das den PrintScreen einbindet und das Capture in einer Datei speichert.

Hier ist etwas, um mit dem Erfassen und Speichern in einer Datei zu beginnen. Sie müssen nur die Taste "Print screen" drücken.

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 Hier ist der Code, um den PrintScreen (und einen anderen Schlüssel) von C # aus zu verbinden:

Hookcode

50

Es gibt keine Möglichkeit, vor Windows 8 direkt in einer Datei ohne ein Tool eines Drittanbieters zu speichern. Hier sind meine persönlichen bevorzugten Tools von Drittanbietern.

Für Windows 8 und höher

Windows Key + PrintScreen speichert den Screenshot in einem Ordner in <user>/Pictures/Screenshots

Für Windows 7

Verwenden Sie in Win 7 einfach das Snipping-Tool: Am einfachsten erreichen Sie es, indem Sie Start drücken und dann "sni" (Enter) eingeben. oder Windows Key dann snienter

Frühere Versionen von Windows

Ich benutze die folgende Tastenkombination, um zu erfassen, und speichere dann mit mspaint. Nachdem Sie es ein paar Mal gemacht haben, dauert es nur 2-3 Sekunden:

  1. Alt+PrintScreen
  2. Win+R ("Lauf")
  3. tippe "mspaint" enter
  4. Ctrl-V (Einfügen)
  5. Ctrl-S (speichern)
  6. verwenden Sie den Dateidialog
  7. Alt-F4 (nahe mspaint)

Außerdem ist Cropper großartig (und Open Source). Es nimmt Rechtecke in eine Datei oder in die Zwischenablage auf und ist natürlich kostenlos.

149
TheSoftwareJedi

Wenig bekannte Tatsache: In den meisten Standarddialogen von Windows (XP) können Sie Strg + C drücken, um eine Textkopie des Dialoginhalts zu erhalten.
Beispiel: Öffnen Sie eine Datei im Editor, drücken Sie die Leertaste, schließen Sie das Fenster, drücken Sie Strg + C im Dialogfeld "Confirm Exit" (Beenden bestätigen), brechen Sie ab und fügen Sie den Text des Dialogfelds in den Editor ein.
Hat nichts mit Ihrer direkten Frage zu tun, aber ich denke, es wäre schön, dies in diesem Thread zu erwähnen.

Außerdem benötigen Sie in der Tat eine Software von Drittanbietern, um den Screenshot zu erstellen, aber Sie müssen dafür nicht den großen Photoshop starten. Etwas Freies und Leichtes wie IrfanWiew oder XnView kann die Arbeit erledigen. Ich benutze MWSnap, um beliebige Teile des Bildschirms zu kopieren. Ich habe ein kleines AutoHotkey-Skript geschrieben, das GDI + -Funktionen aufruft, um Screenshots zu machen. Etc.

17
PhiLho

Danke für den ganzen Quellcode und die Kommentare - dankdem habe ich endlich eine App, die ich wollte :)

Ich habe einige Beispiele zusammengestellt. Quellen und ausführbare Dateien finden Sie hier:

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

Ich verwende InterceptCaptureScreen.exe - führe es einfach in einem Eingabeaufforderungsterminal aus und drücke dann Einfügen, wenn du einen Screenshot aufnehmen möchtest (Dateinamen mit Zeitstempel, png, in demselben Verzeichnis, in dem sich die ausführbare Datei befindet). Die Tasten werden auch dann erfasst, wenn das Terminal nicht scharfgestellt ist.

(Ich verwende die Taste "Einfügen", da die Weitergabe über VNC einfacher sein sollte als über PrintScreen. Auf meinem Laptop muss außerdem die Taste "Fn" gedrückt sein, und die Weitergabe über VNC ist nicht möglich. Natürlich ist es einfach, was zu ändern ist der eigentliche Schlüssel, der im Quellcode verwendet wird).

Hoffe das hilft, Prost!

15
sdaau

Sehr alter Beitrag, den ich merke, aber Windows hat endlich gemerkt, wie verrückt der Prozess war.

In Windows 8.1 (überprüft, funktioniert nicht in Windows 7 (tnx @bobobobo))

windows key + prnt screen speichert den Screenshot in einem Ordner in <user>/Pictures/Screenshots

Quelle - http://windows.Microsoft.com/de-de/windows/take-screen-capture-print-screen#take-screen-capture-print-screen=windows-8

11
Karthik T

Könnte ich WinSnap vorschlagen http://www.ntwind.com/software/winsnap/download-free-version.html . Es bietet eine automatische Speicheroption und erfasst den Alt + Druckbildschirm und andere Tastenkombinationen zum Erfassen von Bildschirm, Fenstern, Dialogfeldern usw.

6
Jason

Dropbox bietet jetzt den Haken, um dies automatisch zu tun. Wenn Sie ein kostenloses Dropbox-Konto haben und die Laptop-App installieren, können Sie durch Drücken von PrtScr Dropbox alle Screenshots automatisch in Ihrem Dropbox-Ordner speichern.

5
mwengler

Versuchen Sie Folgendes: http://www.screenshot-utility.com/

Von ihrer Homepage:

Wenn Sie einen Hotkey drücken, wird ein Schnappschuss Ihres Bildschirms in einer JPG-, GIF- oder BMP Datei gespeichert.

2
JosephStyons

Dies wird es in Delphi tun. Beachten Sie die Verwendung der BitBlt-Funktion, bei der es sich um einen Windows-API-Aufruf handelt, der nicht Delphi-spezifisch ist.

Bearbeiten: Beispielverwendung hinzugefügt

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

Sie benötigen ein Screen Grab-Dienstprogramm eines Drittanbieters für diese Funktionalität in XP. Ich grabe Scott Hanselmans umfangreiches bloggt über coole Tools und suche dort normalerweise nach einem solchen Dienstprogramm - sicher genug, er bloggt über ein paar hier .

2
Peter Meyer

Snagit ... viele Techniker nutzen das.

1
pearcewg

Lassen Sie Picasa im Hintergrund laufen und klicken Sie einfach auf die Schaltfläche "Bildschirm drucken"

Quelle

1
Abilash A

Ohne die Installation eines Autosave-Dienstprogramms für Screenshots, ja, das tun Sie. Es gibt verschiedene Hilfsprogramme, die Sie finden können, wenn Sie dies tun.

Zum Beispiel: http://www.screenshot-utility.com/

1
mattlant

Nach der Installation eines Screenshot-Programms, das ich empfehle, verwenden Sie am besten die Standardmethode "Bildschirm drucken". Öffnen Sie dann Microsoft Office Picture Manager und fügen Sie den Screenshot einfach in den weißen Bereich des gewünschten Verzeichnisses ein. Es wird eine Bitmap erstellt, die Sie bearbeiten oder in einem anderen Format speichern können.

1
Mike Kowalczyk

Natürlich können Sie ein Programm schreiben, das die Zwischenablage überwacht und für jedes Bild in der Zwischenablage einen nervigen SaveAs-Dialog anzeigt ;-). Ich vermute, Sie können sogar herausfinden, ob die letzte gedrückte Taste PrintScreen war, um die Anzahl der Fehlalarme zu begrenzen.

Während ich darüber nachdenke, könntest du auch nach jemandem googeln, der genau das bereits getan hat.


EDIT : .. oder warte einfach, bis jemand den Quelltext hier veröffentlicht - wie auch immer :-)

1
VVS

Dank an TheSoftwareJedi für die Bereitstellung nützlicher Informationen zum Snipping-Tool in Windows 7. Verknüpfung zum Öffnen des Snipping-Tools: Gehen Sie zu Start, geben Sie sni ein. Den Namen finden Sie in der Liste "Snipping-Tool".

enter image description here

1
Zahid Rouf

Möglicherweise möchten Sie Folgendes: http://addons.mozilla.org/en-US/firefox/addon/5648

Ich denke, es gibt eine Version für IE und auch mit Explorer-Integration. Ziemlich gute Software.

0
apandit

Es stellt sich heraus, dass Google Picasa (kostenlos) dies jetzt für Sie erledigt. Wenn Sie es geöffnet haben, wird der Screenshot beim Drücken in einer Datei gespeichert und in Picasa geladen. Nach meiner Erfahrung funktioniert es großartig!

0
Zach

Soweit ich weiß, müssen Sie in XP eine andere App verwenden, um sie tatsächlich zu speichern.

Vista wird mit dem Snipping-Tool geliefert, das den Vorgang ein wenig vereinfacht!

0
Mitchel Sellers