Làm cách nào để lưu ảnh chụp màn hình trực tiếp vào tệp trong Windows? [đóng cửa]


115

Trong Windows XP, người ta có thể nhấn Alt-PrintScreen để sao chép hình ảnh của cửa sổ đang hoạt động hoặc Ctrl-PrintScreen để sao chép hình ảnh của toàn màn hình.

Sau đó, nó có thể được dán vào các ứng dụng chấp nhận hình ảnh: Photoshop, Microsoft Word, v.v.

Tôi tự hỏi: Có cách nào để lưu ảnh chụp màn hình trực tiếp vào một tệp không? Tôi có thực sự phải mở một chương trình hình ảnh, như Paint.net hoặc Photoshop, chỉ để dán một hình ảnh, sau đó lưu nó không?


14
Photoshop ?? Tại sao không sử dụng mspaint hoặc paint.net? Tại sao lại sử dụng một thứ nặng như photoshop ??
GEOCHET 01/10/08

1
Tốt nhất tôi nhận được ở đây là một ảnh chụp màn hình từ với ảnh chụp màn hình của một số thông báo lỗi được dán trực tiếp vào thư HTML.
VVS

1
Xin hãy nhìn vào câu trả lời của tôi, đó là Cuối cùng có thể làm điều đó ít nhất một cách dễ dàng như Mac (Linux chảy vẫn tốt mặc dù)
Karthik T

1
Được gắn cờ để chuyển sang SuperUser. Mặc dù câu trả lời được chấp nhận cuối cùng là một câu trả lời có lập trình, như đã viết, câu hỏi này đang tìm kiếm câu trả lời về cách sử dụng máy tính chung và vì vậy thuộc về SuperUser.
ArtOfWarfare

1
Xin chào, có thể hơi muộn cho câu trả lời nhưng nó có thể giúp những người khác gặp vấn đề tương tự. Có một ứng dụng trong Windows Store mà bạn có thể lưu ảnh chụp màn hình từ khay nhớ tạm vào ảnh tạm thời trên đĩa và trả lại đường dẫn đến tệp, vì vậy bạn có thể sử dụng nó bằng ctrl + v đơn giản trong bất kỳ ứng dụng nào ( microsoft. com / store / apps / 9PM34S06CFVJ ). Bạn sẽ không cần phải mở phần mềm khác để lưu ảnh chụp màn hình vào một tệp nữa.
Giovanni Esposito

Câu trả lời:


50

Bạn có thể viết một cái gì đó khá đơn giản để kết nối PrintScreen và lưu ảnh chụp vào một tệp.

Đây là một cái gì đó để bắt đầu chụp và lưu vào một tệp. Bạn sẽ chỉ cần móc phím "Màn hình in".

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

Cập nhật Đây là mã để nối PrintScreen (và khóa khác) từ C #:

Mã móc


Đoạn mã đẹp. Tất nhiên bạn nên cân nhắc lưu ảnh dưới dạng JPEG hoặc PNG thay vì GIF.
VVS

Định dạng ImageFormat = ImageFormat.Gif; bạn chỉ có thể đặt định dạng ImageFormat = ImageFormat.PNG; hoặc định dạng ImageFormat = ImageFormat.JPG; Tất cả là ở đây cho bạn
Patrick Desjardins

4
OK, tôi nên làm gì với đoạn mã đó? thực hiện nó và nhấn màn hình in mỗi khi tôi muốn ảnh chụp màn hình, hay chỉ một lần? ngoài việc biên dịch nó?
Jaime Hablutzel

3
Có ai có một nhị phân?
Timofey Trofimov

2
Tôi không nghĩ rằng đây là "khá đơn giản" ..
hejdav

153

Không có cách nào để lưu trực tiếp vào tệp mà không có công cụ của bên thứ 3 trước Windows 8. Dưới đây là các giải pháp công cụ không phải bên thứ ba yêu thích của cá nhân tôi.

Dành cho Windows 8 trở lên

Windows Key+ PrintScreen lưu ảnh chụp màn hình vào một thư mục trong<user>/Pictures/Screenshots

Đối với Windows 7

Trong win 7 chỉ cần sử dụng công cụ snipping: Dễ dàng truy cập nhất thông qua việc nhấn Start, sau đó gõ "sni" (enter). hoặc Windows Keysau đósni enter

Các phiên bản trước của Windows

Tôi sử dụng tổ hợp bàn phím sau để chụp, sau đó lưu bằng mspaint. Sau khi bạn làm điều đó một vài lần, chỉ mất 2-3 giây:

  1. Alt+PrintScreen
  2. Win+ R("chạy")
  3. gõ "mspaint" enter
  4. Ctrl- V(dán)
  5. Ctrl- S(lưu)
  6. sử dụng hộp thoại tệp
  7. Alt- F4(đóng mspaint)

Ngoài ra, Cropper rất tuyệt (và mã nguồn mở). Nó thực hiện chụp hình chữ nhật vào tệp hoặc khay nhớ tạm và tất nhiên là miễn phí.


2
Trên thực tế, điều này nhanh chóng và dễ dàng một cách đáng ngạc nhiên. Ngoài ra, nếu bạn đang chụp một loạt ảnh, bạn có thể để mở Paint và sử dụng Ctrl-N để tiếp tục đặt lại vùng sơn và Ctrl-S để lưu nó (không cần Save as). Một ưu điểm khác của việc giữ cho Paint luôn mở là nó ghi nhớ lựa chọn của bạn về định dạng tệp để lưu vào (ví dụ: PNG).
Neil Mayhew,

1
Cảm ơn @Neil. Tôi đã cập nhật câu trả lời này bằng Ctrl-S và các tính năng mới của win 7.
TheSoftwareJedi

1
phím windows + "sni" FTW!
Jason

Lưu ý rằng nó chỉ hoạt động cho ngôn ngữ tiếng Anh. Đối với Ba Lan công cụ này được đặt tên Narzędzie Wycinanie và các công trình loại suy: Winsau đó w, y, enter.
maciek

Không hoạt động trên màn hình khóa, vì vậy không tốt để chụp những hình nền cửa sổ thú vị đó. Không giống như trên Android, mà tôi có thể chụp ảnh màn hình của mọi thứ, bất cứ lúc nào, kể cả màn hình khóa.
Triynko

17

Sự thật ít được biết đến: trong hầu hết các hộp thoại Windows (XP) tiêu chuẩn, bạn có thể nhấn Ctrl + C để có một bản sao nội dung của hộp thoại.
Ví dụ: mở một tệp trong Notepad, nhấn khoảng trắng, đóng cửa sổ, nhấn Ctrl + C trên hộp thoại Xác nhận Thoát, hủy, dán vào Notepad văn bản của hộp thoại.
Không liên quan đến câu hỏi trực tiếp của bạn, nhưng tôi rất vui được đề cập trong chủ đề này.

Ngoài ra, thực sự, bạn cần một phần mềm của bên thứ ba để thực hiện việc chụp ảnh màn hình, nhưng bạn không cần phải sử dụng Photoshop lớn để làm điều đó. Một cái gì đó miễn phí và nhẹ như IrfanWiew hoặc XnView có thể thực hiện công việc. Tôi sử dụng MWSnap để sao chép các phần tùy ý của màn hình. Tôi đã viết một đoạn mã AutoHotkey nhỏ gọi các hàm GDI + để chụp ảnh màn hình. Vân vân.


Chỉ cần tìm thấy điều này bây giờ. Cảm ơn vì mẹo đó.
TankorSmash

Mẹo hay. Đôi khi tôi bực bội vì các hộp thoại thông báo lỗi sẽ không cho phép tôi chọn văn bản để sao chép. Với mẹo này, nhiều người trong số họ làm được! Hãy thử nó trong trình duyệt của bạn tại đây: jsfiddle.net/liamhennessy/cs3jsj6p
Liam

15

Cảm ơn tất cả mã nguồn và nhận xét - nhờ đó, cuối cùng tôi đã có một ứng dụng mà tôi muốn :)

Tôi đã biên soạn một số ví dụ và có thể tìm thấy cả nguồn và tệp thực thi tại đây:

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

Tôi sử dụng InterceptCaptureScreen.exe - chỉ cần chạy nó trong một thiết bị đầu cuối dấu nhắc lệnh, sau đó nhấn Chèn khi bạn muốn chụp ảnh màn hình (tên tệp có dấu thời gian, png, trong cùng thư mục chứa tệp thực thi); các phím sẽ được chụp ngay cả khi thiết bị đầu cuối không được lấy nét.

(Tôi sử dụng phím Chèn, vì nó sẽ có thời gian dễ dàng truyền qua VNC hơn PrintScreen - trên máy tính xách tay của tôi yêu cầu phím Fn cũng được nhấn và điều đó không truyền qua VNC. Tất nhiên, nó rất dễ thay đổi những gì là khóa thực sự được sử dụng trong mã nguồn).

Hy vọng điều này sẽ giúp, Cheers!


1
Chương trình này hoạt động hoàn hảo. Cực kỳ đơn giản và chỉ làm những gì cần thiết.
golmschenk

2
Hoạt động trong Windows 7. Để bật ảnh chụp màn hình trong trò chơi toàn màn hình, tôi phải làm theo các bước sau .
metasequoia

URL chết. (Không có gì đáng ngạc nhiên sau gần một thập kỷ.)
Camille Goudeseune

11

Tôi nhận ra bài viết rất cũ, nhưng windows cuối cùng cũng nhận ra quá trình này không hợp lý như thế nào.

Trong Windows 8.1 (đã xác minh, không hoạt động trong Windows 7 (tnx @bobobobo))

windows key+ prnt screenlưu ảnh chụp màn hình vào một thư mục trong<user>/Pictures/Screenshots

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


Nó không hoạt động trên 7, tôi chỉ thử nó.
bobobobo

@bobobobo ah cảm ơn, có lẽ> = windows 8 rồi.
Karthik T

nó cũng hoạt động trên windows 10. Cảm ơn KarthikT
Usman Hayat Khan.

6

Tôi có thể đề xuất WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html . Nó cung cấp tùy chọn tự động lưu và chụp màn hình in alt + và các tổ hợp phím khác để chụp màn hình, cửa sổ, hộp thoại, v.v.


1
Đảm bảo kiểm tra cài đặt để thiết lập chính xác theo cách bạn muốn.
Daniel X Moore

Cảm ơn bạn, tôi đang tìm kiếm một ứng dụng có thể cho phép tôi thực hiện Alt + Printscreen và tự động lưu ảnh chụp màn hình vào màn hình. Điều này hoạt động hoàn hảo.
Brett

Phiên bản miễn phí có thêm hình mờ và hết hạn sau 30 ngày. Meh.
Camille Goudeseune

5

Dropbox hiện cung cấp hook để thực hiện việc này một cách tự động. Nếu bạn có tài khoản dropbox miễn phí và cài đặt ứng dụng máy tính xách tay, khi bạn nhấn PrtScr Dropbox sẽ cung cấp cho bạn tùy chọn tự động lưu trữ tất cả ảnh chụp màn hình vào thư mục dropbox của bạn.


Điều này thực sự đã hoạt động và tôi nghĩ là cách nhanh nhất để chụp và lưu màn hình. Nếu đó là câu hỏi của tôi, tôi sẽ đánh dấu nó là chấp nhận.
Muhammad Raheel


2

Điều này sẽ làm điều đó trong Delphi. Lưu ý việc sử dụng hàm BitBlt, là một lệnh gọi API Windows, không phải là một cái gì đó cụ thể cho Delphi.

Chỉnh sửa: Đã thêm cách sử dụng mẫu

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

Không cần cài đặt tiện ích tự động lưu ảnh chụp màn hình, có. Có một số tiện ích bạn có thể tìm thấy tuy nhiên khi làm việc này.

Ví dụ: http://www.screenshot-utility.com/


Aw, tệ quá đó là cổ đại. Cập nhật lần cuối vào năm 2001.
isaaclw

1

Tất nhiên, bạn có thể viết một chương trình giám sát khay nhớ tạm và hiển thị hộp thoại SaveAs gây phiền nhiễu cho mọi hình ảnh trong khay nhớ tạm ;-). Tôi đoán bạn thậm chí có thể tìm hiểu xem phím cuối cùng được nhấn có phải là PrintScreen hay không để hạn chế số lần dương tính giả.

Trong khi tôi đang suy nghĩ về nó .. bạn cũng có thể google cho một người nào đó đã làm chính xác điều đó.


CHỈNH SỬA : .. hoặc chỉ cần đợi ai đó đăng nguồn ở đây - như vừa diễn ra :-)


1

Snagit ... rất nhiều dân công nghệ sử dụng nó.


Tại sao phải trả tiền cho một công cụ khi tất cả những gì bạn muốn chỉ là chụp ảnh màn hình?
Dane411, 16/12/12

1

Trước khi cài đặt một chương trình chụp ảnh màn hình, tôi khuyên bạn nên làm điều này, cách tốt nhất để thực hiện việc này là sử dụng phương pháp Print Screen tiêu chuẩn, sau đó mở Microsoft Office Picture Manager và chỉ cần dán ảnh chụp màn hình vào vùng trắng của thư mục mà bạn muốn. Nó sẽ tạo ra một bitmap mà bạn có thể chỉnh sửa hoặc lưu dưới dạng định dạng khác.


Mặc dù điều này có thể hiệu quả, người hỏi có thể yêu cầu một cách để thực hiện việc này theo chương trình.
Peter O.

1

Cảm ơn TheSoftwareJedi đã cung cấp thông tin hữu ích về công cụ snapping trong Windows 7. Phím tắt để mở công cụ Snipping: Vào Start, gõ snipping Và bạn sẽ tìm thấy tên trong danh sách "Snipping Tool"

nhập mô tả hình ảnh ở đây



0

Theo như tôi biết trong XP, bạn phải sử dụng một số ứng dụng khác để thực sự lưu nó.

Vista đi kèm với công cụ Snipping, giúp đơn giản hóa quy trình một chút!


0

Nó chỉ ra rằng Google Picasa (miễn phí) sẽ làm điều này cho bạn ngay bây giờ. Nếu bạn mở nó, khi bạn nhấn nó sẽ lưu ảnh chụp màn hình vào một tệp và tải nó vào Picasa. Theo kinh nghiệm của tôi, nó hoạt động tuyệt vời!



-6

Điều này có thể không:

  1. Nhấn Alt PrintScreen
  2. Mở một thư mục
  3. Nhấp chuột phải -> dán ảnh chụp màn hình

Thí dụ:

Cửa sổ kết quả điểm chuẩn đang mở, hãy chụp ảnh màn hình. Mở C: \ Benchmarks Nhấp chuột phải -> Dán ảnh chụp màn hình Một tệp có tên là screenshot00x.jpg xuất hiện, với văn bản screenshot00x được chọn. Nhập Overclock5

Đó là nó. Không cần mở bất cứ thứ gì. Nếu bạn không viết gì, tên mặc định vẫn giữ nguyên.


phiên bản windows nào có mục menu "dán ảnh chụp màn hình"? (và với nội dung khay nhớ tạm của loại hình ảnh không có dán được kích hoạt trong win7).
eckes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.