Jak mogę zapisać zrzut ekranu bezpośrednio do pliku w systemie Windows? [Zamknięte]


115

W systemie Windows XP można nacisnąć Alt-PrintScreen, aby skopiować obraz aktywnego okna lub Ctrl-PrintScreen, aby skopiować obraz całego pulpitu.

Można to następnie wkleić do aplikacji, które akceptują obrazy: Photoshop, Microsoft Word itp.

Zastanawiam się: czy istnieje sposób na zapisanie zrzutu ekranu bezpośrednio do pliku? Czy naprawdę muszę otwierać program do obsługi obrazów, taki jak Paint.net lub Photoshop, po prostu wkleić obraz, a następnie go zapisać?


14
Photoshop ?? Dlaczego nie skorzystać z mspaint lub paint.net? Po co używać czegoś tak ciężkiego jak Photoshop?
GEOCHET

1
Najlepsze, co tu dostałem, to zrzut ekranu programu Word ze zrzutem ekranu jakiegoś komunikatu o błędzie wklejonego bezpośrednio do wiadomości HTML.
VVS

1
Proszę spojrzeć na moją odpowiedź, NAPRAWDĘ można to zrobić przynajmniej tak łatwo jak na Macu (chociaż przepływ Linuksa jest jeszcze lepszy)
Karthik T

1
Oznaczone do przeniesienia do SuperUser. Chociaż zaakceptowana odpowiedź była odpowiedzią programową, jak napisano, to pytanie dotyczyło ogólnej odpowiedzi na temat użytkowania komputera i dlatego należy do SuperUser.
ArtOfWarfare

1
Cześć, może trochę za późno na odpowiedź, ale może pomóc innym z podobnym problemem. W Sklepie Windows znajduje się aplikacja, za pomocą której można zapisać zrzut ekranu ze schowka do tymczasowego obrazu na dysku i zwrócić ścieżkę do pliku, dzięki czemu można go używać za pomocą prostego ctrl + v w dowolnej aplikacji ( microsoft. pl / store / apps / 9PM34S06CFVJ ). Nie musisz już otwierać innego oprogramowania, aby zapisać zrzut ekranu do pliku.
Giovanni Esposito

Odpowiedzi:


50

Możesz zakodować coś całkiem prostego, co podłączy PrintScreen i zapisze przechwycenie w pliku.

Oto coś, od czego można zacząć przechwytywać i zapisywać do pliku. Wystarczy zaczepić o klawisz „Drukuj ekran”.

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

Aktualizacja Oto kod, aby podłączyć PrintScreen (i inny klucz) z C #:

Kod haka


Ładne fragmenty kodu. Oczywiście powinieneś rozważyć zapisanie obrazu jako JPEG lub PNG zamiast GIF.
VVS

ImageFormat format = ImageFormat.Gif; możesz po prostu ustawić format ImageFormat = ImageFormat.PNG; lub ImageFormat format = ImageFormat.JPG; Wszystko jest tu dla Ciebie
Patrick Desjardins

4
OK, co mam zrobić z tym fragmentem kodu? uruchom go i naciśnij print screen za każdym razem, gdy chcę zrzut ekranu, czy tylko raz? poza kompilacją?
Jaime Hablutzel

3
Czy ktoś miał plik binarny?
Timofey Trofimov

2
Nie sądzę, żeby to było "całkiem proste" ...
hejdav

153

Nie ma możliwości zapisania bezpośrednio do pliku bez narzędzia innej firmy przed systemem Windows 8. Oto moje ulubione rozwiązania narzędziowe innych firm.

W systemie Windows 8 i nowszych

Windows Key+ PrintScreen zapisuje zrzut ekranu w folderze w formacie<user>/Pictures/Screenshots

W systemie Windows 7

W win 7 po prostu użyj narzędzia do wycinania: Najłatwiej dostępne poprzez naciśnięcie Start, a następnie wpisanie "sni" (enter). albo Windows Keywtedysni enter

Wcześniejsze wersje systemu Windows

Używam następującej kombinacji klawiszy do przechwytywania, a następnie zapisuję za pomocą mspaint. Po kilkukrotnym wykonaniu zajmuje to tylko 2-3 sekundy:

  1. Alt+PrintScreen
  2. Win+ R(„bieg”)
  3. wpisz „mspaint” enter
  4. Ctrl- V(wklej)
  5. Ctrl- S(zapisz)
  6. użyj okna dialogowego pliku
  7. Alt- F4(zamknij mspaint)

Ponadto Cropper jest świetny (i open source). Przechwytuje prostokąt do pliku lub schowka i jest oczywiście bezpłatny.


2
W rzeczywistości jest to zaskakująco szybkie i łatwe. Ponadto, jeśli robisz serię zdjęć, możesz pozostawić otwartą aplikację Paint i użyć Ctrl-N, aby nadal resetować obszar malowania i Ctrl-S, aby go zapisać (nie ma potrzeby zapisywania jako). Kolejną zaletą pozostawiania otwartego programu Paint jest to, że zapamiętuje wybrany format pliku do zapisania (np. PNG).
Neil Mayhew

1
Dzięki @ Neil. Zaktualizowałem tę odpowiedź za pomocą Ctrl-S i nowych funkcji Win 7.
TheSoftwareJedi

1
klawisz Windows + „sni” FTW!
Jason,

Zauważ, że działa tylko w przypadku języka angielskiego. Na polskim narzędzie o nazwie Narzędzie Wycinanie i prace analogicznie: Winwtedy w, y, enter.
maciek

Nie działa na ekranie blokady, więc nie nadaje się do przechwytywania fajnych teł okien. W przeciwieństwie do Androida, na którym mogę zrobić zrzut ekranu wszystkiego, w dowolnym momencie, w tym ekranu blokady.
Triynko

17

Mało znany fakt: w większości standardowych okien dialogowych systemu Windows (XP) można nacisnąć Ctrl + C, aby uzyskać tekstową kopię zawartości okna dialogowego.
Przykład: otwórz plik w Notatniku, naciśnij spację, zamknij okno, naciśnij Ctrl + C w oknie dialogowym Potwierdź wyjście, anuluj, wklej w Notatniku tekst okna.
Nie dotyczy to twojego bezpośredniego pytania, ale pomyślałem, że fajnie byłoby o tym wspomnieć w tym wątku.

Poza tym, do zrobienia zrzutu ekranu potrzebujesz oprogramowania innej firmy, ale nie musisz do tego odpalać dużego Photoshopa. Coś darmowego i lekkiego, jak IrfanWiew lub XnView, może wykonać zadanie. Używam MWSnap do kopiowania dowolnych części ekranu. Napisałem mały skrypt AutoHotkey wywołujący funkcje GDI +, aby robić zrzuty ekranu. Itp.


Właśnie znalazłem to teraz. Dzięki za tę wskazówkę.
TankorSmash

Niezła wskazówka. Czasami denerwują mnie okna dialogowe komunikatów o błędach, które nie pozwalają mi wybrać tekstu do skopiowania. Dzięki tej wskazówce wielu z nich to robi! Wypróbuj w swojej przeglądarce tutaj: jsfiddle.net/liamhennessy/cs3jsj6p
Liam

15

Dzięki za cały kod źródłowy i komentarze - dzięki temu w końcu mam aplikację, o której mi chodziło :)

Skompilowałem kilka przykładów i zarówno źródła, jak i pliki wykonywalne można znaleźć tutaj:

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

Używam InterceptCaptureScreen.exe - po prostu uruchom go w terminalu wiersza poleceń, a następnie naciśnij Wstaw, gdy chcesz zrobić zrzut ekranu (nazwy plików z sygnaturą czasową, png, w tym samym katalogu, w którym znajduje się plik wykonywalny); klucze zostaną przechwycone, nawet jeśli terminal nie jest aktywny.

(Używam klawisza Insert, ponieważ powinno mieć łatwiejszy czas propagacji przez, powiedzmy, VNC niż PrintScreen - co na moim laptopie wymaga również naciśnięcia klawisza Fn i nie rozprzestrzenia się przez VNC. Oczywiście łatwo jest to zmienić. to rzeczywisty klucz używany w kodzie źródłowym).

Mam nadzieję, że to pomoże, na zdrowie!


1
Ten program działa doskonale. Niezwykle proste i robi to, czego potrzeba.
golmschenk

2
Działa również w systemie Windows 7. Aby włączyć zrzuty ekranu w grze pełnoekranowej, musiałem wykonać następujące kroki .
metasequoia,

Martwy adres URL. (Nic dziwnego po prawie dziesięciu latach.)
Camille Goudeseune

11

Zdaję sobie sprawę, że to bardzo stary post, ale Windows w końcu zdał sobie sprawę, jak głupi był ten proces.

W systemie Windows 8.1 (zweryfikowany, nie działa w systemie Windows 7 (tnx @bobobobo))

windows key+ prnt screenzapisuje zrzut ekranu w folderze w formacie<user>/Pictures/Screenshots

Źródło - http://windows.microsoft.com/en-in/windows/take-screen-capture-print-screen#take-screen-capture-print-screen=windows-8


Nie działa na 7, po prostu spróbowałem.
bobobobo

@bobobobo ah dzięki, może> = Windows 8 w takim razie.
Karthik T

jego praca również w systemie Windows 10. Dzięki KarthikT
Usman Hayat Khan

6

Mogę zasugerować WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html . Zapewnia opcję automatycznego zapisywania i przechwytuje alt + printscreen i inne kombinacje klawiszy do przechwytywania ekranu, okien, okien dialogowych itp.


1
Pamiętaj, aby sprawdzić ustawienia, aby skonfigurować je dokładnie tak, jak chcesz.
Daniel X Moore

Dziękuję, szukałem aplikacji, która pozwoliłaby mi zrobić Alt + Printscreen i automatycznie zapisać zrzut ekranu na pulpicie. To działa doskonale.
Brett

Darmowa wersja dodaje znak wodny i wygasa po 30 dniach. Meh.
Camille Goudeseune

5

Dropbox zapewnia teraz haczyk, dzięki któremu można to zrobić automagicznie. Jeśli otrzymasz bezpłatne konto Dropbox i zainstalujesz aplikację na laptopa, po naciśnięciu PrtScr Dropbox da Ci opcję automatycznego przechowywania wszystkich zrzutów ekranu w folderze Dropbox.


To faktycznie zadziałało i myślę, że jest to najszybszy sposób na przechwycenie i zapisanie ekranu. Gdyby to było moje pytanie, oznaczyłbym je jako zaakceptowane.
Muhammad Raheel


2

Zrobi to w Delphi. Zwróć uwagę na użycie funkcji BitBlt, która jest wywołaniem interfejsu API systemu Windows, a nie czymś specyficznym dla Delphi.

Edycja: Dodano przykładowe użycie

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

Bez instalowania narzędzia do automatycznego zapisywania zrzutów ekranu, tak. Istnieje kilka narzędzi, które możesz jednak znaleźć, jakkolwiek to robią.

Na przykład: http://www.screenshot-utility.com/


Szkoda, że ​​to starożytne. Ostatnia aktualizacja w 2001 r.
isaaclw

1

Oczywiście możesz napisać program, który monitoruje schowek i wyświetla irytujące okno dialogowe SaveAs dla każdego obrazu w schowku ;-). Myślę, że możesz nawet dowiedzieć się, czy ostatni naciśnięty klawisz to PrintScreen, aby ograniczyć liczbę fałszywych alarmów.

Kiedy o tym myślę… możesz też wygooglować kogoś, kto już to zrobił.


EDYTUJ : .. lub po prostu poczekaj, aż ktoś opublikuje tutaj źródło - tak się złożyło :-)


1

Snagit ... używa tego wielu techników.


po co płacić za narzędzie, skoro wystarczy zrobić zrzut ekranu?
Dane411

1

Oprócz zainstalowania programu do przechwytywania ekranu, który polecam, najlepszym sposobem na to jest użycie standardowej metody Print Screen, a następnie otwarcie programu Microsoft Office Picture Manager i po prostu wklejenie zrzutu ekranu w białym obszarze wybranego katalogu. Stworzy bitmapę, którą możesz edytować lub zapisać w innym formacie.


Chociaż może to zadziałać, pytający prawdopodobnie prosi o sposób zrobienia tego programowo.
Peter O.

1

Podziękowania dla TheSoftwareJedi za dostarczenie przydatnych informacji o narzędziu do przycinania w Windows 7. Skrót do otwarcia narzędzia do wycinania: Idź do Start, wpisz sni. Nazwę znajdziesz na liście "Narzędzie do wycinania"

wprowadź opis obrazu tutaj



0

O ile wiem w XP, tak, musisz użyć innej aplikacji, aby ją zapisać.

Vista jest dostarczana z narzędziem Snipping, które nieco upraszcza proces!


0

Okazuje się, że Google Picasa (bezpłatna) zrobi to teraz za Ciebie. Jeśli masz ją otwartą, po naciśnięciu zapisze zrzut ekranu do pliku i załaduje go do Picasy. Z mojego doświadczenia wynika, że ​​działa świetnie!



-6

Czy to możliwe:

  1. Naciśnij Alt PrintScreen
  2. Otwórz folder
  3. Kliknij prawym przyciskiem myszy -> wklej zrzut ekranu

Przykład:

Okno wyników testu porównawczego jest otwarte, zrób zrzut ekranu. Otwórz C: \ Benchmarks Kliknij prawym przyciskiem myszy -> Wklej zrzut ekranu Pojawi się plik o nazwie screenshot00x.jpg z zaznaczonym tekstem screenshot00x. Wpisz Overclock5

Otóż ​​to. Nie musisz niczego otwierać. Jeśli nic nie napiszesz, pozostanie domyślna nazwa.


która wersja systemu Windows ma pozycję menu „wklej zrzut ekranu”? (a przy zawartości schowka typu obraz nie ma wklejania aktywowanego w win7).
eckes
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.