Bir ekran görüntüsünü doğrudan Windows'ta bir dosyaya nasıl kaydedebilirim? [kapalı]


115

Windows XP'de, aktif pencerenin bir görüntüsünü kopyalamak için Alt-PrintScreen'e veya tam masaüstünün bir görüntüsünü kopyalamak için Ctrl-PrintScreen'e basılabilir.

Bu daha sonra görüntüleri kabul eden uygulamalara yapıştırılabilir: Photoshop, Microsoft Word vb.

Merak ediyorum: Ekran görüntüsünü doğrudan bir dosyaya kaydetmenin bir yolu var mı? Ben mi gerçekten Paint.net veya Photoshop gibi bir görüntü programı açmak zorunda, sadece bir görüntü yapıştırmak, ardından kaydedin?


14
Photoshop ?? Neden mspaint veya paint.net kullanmıyorsunuz? Neden photoshop kadar ağır bir şey kullanmalı?
GEOCHET

1
Burada aldığım en iyi şey, doğrudan bir HTML postasına yapıştırılan bazı hata mesajlarının ekran görüntüsünü içeren bir kelimenin ekran görüntüsü oldu.
VVS

1
Lütfen cevabıma bir göz atın, nihayetinde bunu en az Mac kadar kolay yapmak mümkün (linux akışı yine de daha iyi)
Karthik T

1
SuperUser'a geçiş için işaretlendi. Kabul edilen cevap programlı bir cevap olmasına rağmen, yazıldığı gibi, bu soru genel bir bilgisayar kullanım cevabı arıyordu ve bu nedenle SuperUser'a aittir.
ArtOfWarfare

1
Merhaba, belki cevap için biraz geç olabilir ama benzer bir sorunu olan başkalarına yardımcı olabilir. Windows Mağazası'nda, bir ekran görüntüsünü panodan diskteki geçici bir görüntüye kaydedebileceğiniz ve dosyanın yolunu geri gönderebileceğiniz, böylece herhangi bir uygulamada basit bir ctrl + v ile kullanabileceğiniz bir uygulama vardır ( microsoft. com.tr / store / apps / 9PM34S06CFVJ ). Artık ekran görüntüsünü bir dosyaya kaydetmek için başka bir yazılımı açmanıza gerek kalmayacak.
Giovanni Esposito

Yanıtlar:


50

PrintScreen'i bağlayacak ve yakalamayı bir dosyaya kaydedecek oldukça basit bir şey kodlayabilirsiniz.

İşte yakalamaya ve bir dosyaya kaydetmeye başlamanız gereken bir şey. "Ekranı yazdır" anahtarını bağlamanız yeterlidir.

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

Güncelle İşte PrintScreen'i (ve diğer anahtarı) C # 'dan bağlamak için kod:

Kanca kodu


Güzel kod parçacıkları. Elbette resmi GIF yerine JPEG veya PNG olarak kaydetmeyi düşünmelisiniz.
VVS

ImageFormat formatı = ImageFormat.Gif; ImageFormat format = ImageFormat.PNG olarak ayarlayabilirsiniz; veya ImageFormat formatı = ImageFormat.JPG; Her şey sizin için burada
Patrick Desjardins

4
Tamam, o pasajla ne yapmalıyım? Çalıştırın ve ekran görüntüsünü her istediğimde veya sadece bir kez yazdır ekranına basın. derlemenin dışında?
Jaime Hablutzel

3
Kimsede ikili var mıydı?
Timofey Trofimov

2
Bunun "oldukça basit" olduğunu sanmıyorum ..
hejdav

153

Windows 8'den önce üçüncü taraf bir araç olmadan doğrudan bir dosyaya kaydetmenin bir yolu yoktur. İşte benim kişisel favori üçüncü taraf olmayan araç çözümlerim.

Windows 8 ve üstü için

Windows Key+ PrintScreen ekran görüntüsünü bir klasöre kaydeder<user>/Pictures/Screenshots

Windows 7 için

Win 7'de sadece ekran alıntısı aracını kullanın: En kolay şekilde Başlat'a basarak ve ardından "sni" (enter) yazarak erişilebilir. veya Windows Keysonrasni enter

Windows'un önceki sürümleri

Yakalamak için aşağıdaki klavye kombinasyonunu kullanıyorum, ardından mspaint kullanarak kaydetiyorum. Birkaç kez yaptıktan sonra sadece 2-3 saniye sürer:

  1. Alt+PrintScreen
  2. Win+ R("çalıştır")
  3. "mspaint" yazın enter
  4. Ctrl- V(yapıştır)
  5. Ctrl- S(kaydet)
  6. dosya iletişim kutusunu kullan
  7. Alt- F4(mspaint'i kapat)

Ek olarak, Cropper harika (ve açık kaynak). Dosyaya veya panoya dikdörtgen yakalama yapar ve elbette ücretsizdir.


2
Aslında, bu şaşırtıcı derecede hızlı ve kolaydır. Ayrıca, bir dizi çekim yapıyorsanız, Paint'i açık bırakabilir ve boyama alanını sıfırlamaya devam etmek için Ctrl-N ve kaydetmek için Ctrl-S tuşlarını kullanabilirsiniz (Farklı kaydetmeye gerek yoktur). Paint'i açık tutmanın bir başka avantajı da kaydetmek için seçtiğiniz dosya biçimi seçiminizi hatırlamasıdır (ör. PNG).
Neil Mayhew

1
Teşekkürler @Neil. Bu cevabı Ctrl-S ve yeni win 7 özellikleriyle güncelledim.
TheSoftwareJedi

1
windows tuşu + "sni" FTW!
Jason

Yalnızca İngilizce yerel ayarı için çalıştığını unutmayın. Lehçe için aracı analojik Narzędzie Wycinanie ve eserleri adlandırılır: Wino zaman w, y, enter.
maciek

Kilit ekranında çalışmaz, bu yüzden bu harika pencere arka planlarını yakalamak için iyi değil. Kilit ekranı da dahil olmak üzere istediğim zaman herhangi bir şeyin ekran görüntüsünü yakalayabildiğim Android'in aksine.
Triynko

17

Az bilinen gerçek: Çoğu standart Windows (XP) iletişim kutusunda, iletişim kutusunun içeriğinin metinsel bir kopyasına sahip olmak için Ctrl + C tuşlarına basabilirsiniz.
Örnek: Not Defteri'nde bir dosya açın, boşluğa basın, pencereyi kapatın, Çıkışı Onayla iletişim kutusunda Ctrl + C tuşlarına basın, iletişim kutusunun metnini Not Defteri'ne yapıştırın, iptal edin.
Doğrudan sorunuzla alakasız, ancak bu ileti dizisinde bahsetmenin güzel olacağını düşündüm.

Ayrıca, ekran görüntüsünü yapmak için üçüncü taraf bir yazılıma ihtiyacınız var, ancak bunun için büyük Photoshop'u çalıştırmanıza gerek yok. IrfanWiew veya XnView gibi ücretsiz ve hafif bir şey işi yapabilir. Ekranın rastgele kısımlarını kopyalamak için MWSnap kullanıyorum. Ekran görüntüsü almak için GDI + işlevlerini çağıran küçük bir AutoHotkey betiği yazdım. Vb.


Bunu şimdi buldum. Bu ipucu için teşekkürler.
TankorSmash

Güzel ipucu. Bazen kopyalanacak metni seçmeme izin vermeyen hata mesajı diyalogları beni hayal kırıklığına uğratıyor. Bu ipucu ile çoğu yapıyor! Tarayıcınızda burada deneyin: jsfiddle.net/liamhennessy/cs3jsj6p
Liam

15

Tüm kaynak kodu ve yorumlar için teşekkürler - bu sayede sonunda istediğim bir uygulamaya sahibim :)

Bazı örnekleri derledim ve hem kaynaklar hem de çalıştırılabilir dosyalar burada bulunabilir:

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

InterceptCaptureScreen.exe'yi kullanıyorum - sadece bir komut istemi terminalinde çalıştırın ve bir ekran görüntüsü almak istediğinizde (zaman damgalı dosya adları, png, yürütülebilir dosyanın bulunduğu dizinde) Ekle'ye basın; terminal odakta olmasa bile tuşlar yakalanır.

(Ekle anahtarını kullanıyorum, çünkü VNC'de yayılması PrintScreen'den daha kolay olmalı - ki bu dizüstü bilgisayarımda Fn tuşuna da basılmasını gerektiriyor ve bu VNC'de yayılmıyor. Elbette, neyi değiştirmek kolaydır. kaynak kodda kullanılan gerçek anahtardır).

Umarım bu yardımcı olur, Şerefe!


1
Bu program mükemmel çalışıyor. Son derece basit ve tam da gerekli olanı yapıyor.
golmschenk

2
Windows 7'de de çalışır. Tam ekran bir oyunda ekran görüntülerini etkinleştirmek için şu adımları izlemem gerekiyordu .
metasequoia

Ölü URL. (Neredeyse on yıldan sonra şaşırtıcı değil.)
Camille Goudeseune

11

Çok eski bir gönderi fark ettim, ancak pencereler sonunda sürecin ne kadar saçma olduğunu anladı.

Windows 8.1'de (doğrulandı, Windows 7'de çalışmıyor (tnx @bobobobo))

windows key+ prnt screenekran görüntüsünü bir klasöre kaydeder<user>/Pictures/Screenshots

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


7'de çalışmıyor, sadece denedim.
bobobobo

@bobobobo ah teşekkürler, belki> = Windows 8 sonra.
Karthik T

Windows 10'da da çalışması. Teşekkürler KarthikT
Usman Hayat Khan

6

WinSnap'i http://www.ntwind.com/software/winsnap/download-free-version.html önerebilir miyim ? Otomatik kaydetme seçeneği sunar ve alt + baskı ekranını ve diğer tuş kombinasyonlarını yakalarken ekranı, pencereleri, iletişim kutusunu vb. Yakalar.


1
Tam olarak istediğiniz gibi ayarlamak için ayarları kontrol ettiğinizden emin olun.
Daniel X Moore

Teşekkürler, Alt + Printscreen yapmama ve ekran görüntüsünü masaüstüne otomatik kaydetmeme izin verecek bir uygulama arıyordum. Bu mükemmel çalışıyor.
Brett

Ücretsiz sürüm bir filigran ekler ve 30 gün sonra sona erer. Meh.
Camille Goudeseune

5

Dropbox artık kancanın bunu otomatik olarak yapmasını sağlıyor. Ücretsiz bir dropbox hesabı alırsanız ve dizüstü bilgisayar uygulamasını yüklerseniz, PrtScr düğmesine bastığınızda Dropbox, tüm ekran görüntülerini otomatik olarak dropbox klasörünüze kaydetme seçeneği sunar.


Bu gerçekten işe yaradı ve bence ekranı yakalayıp kaydetmenin en hızlı yolu. Benim sorum olsaydı, kabul etti olarak işaretlerdim.
Muhammad Raheel

2

XP'de bu işlevsellik için bir 3. taraf ekran yakalama yardımcı programına ihtiyacınız var. Scott Hanselman'ın harika araçlar hakkındaki kapsamlı blog yazısını inceliyorum ve genellikle orada böyle bir yardımcı program aradım - elbette, burada bir çift hakkında blog yazdı .


2

Bu, Delphi'de yapacak. Delphi'ye özgü bir şey değil, bir Windows API çağrısı olan BitBlt işlevinin kullanımına dikkat edin.

Düzenleme: Örnek kullanım eklendi

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

Bir ekran görüntüsü otomatik kaydetme yardımcı programı yüklemeden, evet yaparsınız. Bunu yaparken bulabileceğiniz birkaç yardımcı program vardır.

Örneğin: http://www.screenshot-utility.com/


Çok kötü, bu çok eski. En son 2001 yılında güncellendi.
isaaclw

1

Elbette panoyu izleyen ve panodaki her görüntü için can sıkıcı bir SaveAs iletişim kutusu görüntüleyen bir program yazabilirsiniz ;-). Yanlış pozitiflerin sayısını sınırlamak için basılan son tuşun PrintScreen olup olmadığını bile öğrenebilirsiniz sanırım.

Ben bunu düşünürken .. zaten tam olarak bunu yapmış biri için de google da yapabilirsiniz.


DÜZENLEME : .. veya sadece birinin kaynağı buraya göndermesini bekleyin - aynen böyle :-)


1

Snagit ... birçok teknoloji adamı bunu kullanıyor.


Tek istediğiniz sadece bir ekran görüntüsü almakken neden bir araç için para ödeyesiniz?
Dane411

1

Tavsiye ettiğim bir ekran yakalama programını kurmanın kısa bir kısmı, bunu yapmanın en iyi yolu standart Print Screen yöntemini kullanmak ve ardından Microsoft Office Picture Manager'ı açmak ve ekran görüntüsünü istediğiniz dizinin beyaz alanına yapıştırmaktır. Düzenleyebileceğiniz veya farklı bir format olarak kaydedebileceğiniz bir bitmap oluşturur.


Bu işe yarayabilir, ancak soruyu soran kişi muhtemelen bunu programlı olarak yapmanın bir yolunu sormaktadır.
Peter O.

1

Windows 7'de yapışma aracı hakkında yararlı bilgiler sağladığı için TheSoftwareJedi'ye teşekkür ederiz. Ekran Alıntısı aracını açmak için kısayol: Başlat'a gidin, sni yazın Ve adı "Ekran Alıntısı Aracı" listesinde bulacaksınız.

görüntü açıklamasını buraya girin


1

Picasa'nın arka planda çalışmaya devam etmesini sağlayın ve "Ekranı Yazdır" tuşunu tıklamanız yeterlidir

Kaynak


0

XP'de bildiğim kadarıyla, evet gerçekten kaydetmek için başka bir uygulama kullanmalısınız.

Vista, süreci biraz basitleştiren Snipping aracıyla birlikte gelir!


0

Görünüşe göre Google Picasa (ücretsiz) bunu sizin için şimdi yapacak. Açtıysanız, vurduğunuzda ekran görüntüsünü bir dosyaya kaydedecek ve Picasa'ya yükleyecektir. Deneyimlerime göre harika çalışıyor!



-6

Mümkün mü:

  1. Alt PrintScreen'e basın
  2. Bir klasör açın
  3. Sağ tıklayın -> ekran görüntüsünü yapıştır

Misal:

Karşılaştırma sonucu penceresi açık, bir ekran görüntüsü alın. Aç C: \ Benchmarks Sağ tıklayın -> Ekran görüntüsünü yapıştır ekran görüntüsü00x seçili olan screenshot00x.jpg adlı bir dosya görüntülenir. Overclock5 yazın

Bu kadar. Hiçbir şeyi açmanıza gerek yok. Hiçbir şey yazmazsanız varsayılan ad kalır.


hangi Windows sürümünde "ekran görüntüsünü yapıştır" menü girişi var? (ve resim türünde bir pano içeriği ile win7'de etkinleştirilmiş yapıştırma yoktur).
Eckes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.