ฉันจะบันทึกภาพหน้าจอโดยตรงไปยังไฟล์ใน Windows ได้อย่างไร [ปิด]


115

ใน Windows XP คุณสามารถกด Alt-PrintScreen เพื่อคัดลอกรูปภาพของหน้าต่างที่ใช้งานอยู่หรือ Ctrl-PrintScreen เพื่อคัดลอกรูปภาพของเดสก์ท็อปแบบเต็ม

จากนั้นสามารถวางลงในแอพพลิเคชั่นที่รองรับรูปภาพ: Photoshop, Microsoft Word ฯลฯ

ฉันสงสัยว่า: มีวิธีบันทึกภาพหน้าจอลงในไฟล์โดยตรงหรือไม่? ฉันต้องเปิดโปรแกรมรูปภาพจริงๆเช่น Paint.net หรือ Photoshop เพียงแค่วางภาพแล้วบันทึกหรือไม่


14
Photoshop ?? ทำไมไม่ใช้ mspaint หรือ paint.net ทำไมใช้ของหนักเท่า photoshop ??
GEOCHET

1
ที่ดีที่สุดที่ฉันได้มาที่นี่คือภาพหน้าจอของคำที่มีภาพหน้าจอของข้อความแสดงข้อผิดพลาดบางอย่างที่วางลงในเมล HTML โดยตรง
VVS

1
โปรดดูคำตอบของฉันในที่สุดก็เป็นไปได้ที่จะทำอย่างน้อยที่สุดได้อย่างง่ายดายเช่นเดียวกับ Mac (linux flow ยังคงดีกว่า)
Karthik T

1
ตั้งค่าสถานะสำหรับการเคลื่อนย้ายไปยัง SuperUser แม้ว่าคำตอบที่ได้รับการยอมรับจะกลายเป็นคำตอบแบบเป็นโปรแกรมตามที่เขียนไว้คำถามนี้กำลังมองหาคำตอบสำหรับการใช้งานคอมพิวเตอร์ทั่วไปและเป็นของ SuperUser
ArtOfWarfare

1
สวัสดีอาจจะช้าไปหน่อยสำหรับคำตอบ แต่สามารถช่วยผู้อื่นที่มีปัญหาคล้ายกันได้ มีแอปพลิเคชันใน Windows Store ซึ่งคุณสามารถบันทึกภาพหน้าจอจากคลิปบอร์ดเป็นภาพชั่วคราวบนดิสก์และส่งคืนเส้นทางไปยังไฟล์เพื่อให้คุณสามารถใช้กับ ctrl + v อย่างง่ายในแอปพลิเคชันใดก็ได้ ( microsoft. com / store / apps / 9PM34S06CFVJ ) คุณไม่จำเป็นต้องเปิดซอฟต์แวร์อื่นเพื่อบันทึกภาพหน้าจอลงในไฟล์อีกต่อไป
Giovanni Esposito

คำตอบ:


50

คุณสามารถเขียนโค้ดอะไรบางอย่างที่เรียบง่ายซึ่งจะเชื่อมต่อ PrintScreen และบันทึกการจับภาพในไฟล์

นี่คือสิ่งที่จะเริ่มจับภาพและบันทึกลงในไฟล์ คุณจะต้องเกี่ยวปุ่ม "พิมพ์หน้าจอ"

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

อัปเดต นี่คือรหัสสำหรับเชื่อมต่อ PrintScreen (และคีย์อื่น ๆ ) จาก C #:

รหัสเบ็ด


ตัวอย่างโค้ดที่ดี แน่นอนคุณควรพิจารณาบันทึกภาพเป็น JPEG หรือ PNG แทน GIF
VVS

รูปแบบ ImageFormat = ImageFormat.Gif; คุณสามารถตั้งค่ารูปแบบ ImageFormat = ImageFormat.PNG; หรือรูปแบบ ImageFormat = ImageFormat.JPG; ทั้งหมดอยู่ที่นี่สำหรับคุณ
Patrick Desjardins

4
ตกลงฉันควรทำอย่างไรกับตัวอย่างข้อมูลนั้น ดำเนินการและกดพิมพ์หน้าจอทุกครั้งที่ฉันต้องการภาพหน้าจอหรือเพียงครั้งเดียว? นอกเหนือจากการรวบรวม?
Jaime Hablutzel

3
ทุกคนมีไบนารีหรือไม่?
Timofey Trofimov

2
ฉันไม่คิดว่ามันจะ "สวยง่ายๆ" ..
hejdav

153

ไม่มีวิธีใดที่จะบันทึกโดยตรงไปยังไฟล์โดยไม่ใช้เครื่องมือของบุคคลที่สามก่อน Windows 8 นี่คือโซลูชันเครื่องมือที่ไม่ใช่ของบุคคลที่สามที่ชื่นชอบส่วนตัวของฉัน

สำหรับ Windows 8 และใหม่กว่า

Windows Key+ PrintScreen บันทึกภาพหน้าจอลงในโฟลเดอร์ใน<user>/Pictures/Screenshots

สำหรับ Windows 7

ใน win 7 เพียงใช้เครื่องมือสนิป: เข้าถึงได้ง่ายที่สุดโดยการกดเริ่มจากนั้นพิมพ์ "sni" (Enter) หรือ Windows Keyจากนั้นsni enter

Windows รุ่นก่อนหน้า

ฉันใช้ชุดแป้นพิมพ์ต่อไปนี้เพื่อจับภาพจากนั้นบันทึกโดยใช้ mspaint หลังจากทำสองสามครั้งใช้เวลาเพียง 2-3 วินาที:

  1. Alt+PrintScreen
  2. Win+ R("วิ่ง")
  3. พิมพ์ "mspaint" enter
  4. Ctrl- V(วาง)
  5. Ctrl- S(บันทึก)
  6. ใช้กล่องโต้ตอบไฟล์
  7. Alt- F4(ปิด mspaint)

นอกจากนี้Cropperยังยอดเยี่ยม (และโอเพ่นซอร์ส) มันจับภาพสี่เหลี่ยมผืนผ้าไปยังไฟล์หรือคลิปบอร์ดและแน่นอนว่าฟรี


2
จริงๆแล้วนี่เป็นเรื่องง่ายและรวดเร็วอย่างน่าประหลาดใจ นอกจากนี้หากคุณกำลังถ่ายภาพเป็นชุดคุณสามารถเปิด Paint ทิ้งไว้และใช้ Ctrl-N เพื่อรีเซ็ตพื้นที่สีและ Ctrl-S เพื่อบันทึก (ไม่จำเป็นต้องบันทึกเป็น) ข้อดีอีกอย่างของการเปิด Paint ไว้คือจำรูปแบบไฟล์ที่คุณเลือกเพื่อบันทึกลงใน (เช่น PNG)
Neil Mayhew

1
ขอบคุณ @Neil ฉันอัปเดตคำตอบนี้ด้วย Ctrl-S และคุณสมบัติใหม่ของ win 7
TheSoftwareJedi

1
คีย์ windows + "sni" FTW!
Jason

โปรดทราบว่าใช้ได้กับภาษาอังกฤษเท่านั้น สำหรับโปแลนด์เครื่องมือที่มีชื่อว่าNarzędzie Wycinanie และผลงาน analogically: Winแล้วw, ,y enter
maciek

ไม่ทำงานบนหน้าจอล็อกดังนั้นจึงไม่เหมาะสำหรับการจับภาพพื้นหลังของหน้าต่างที่สวยงามเหล่านั้น แตกต่างอย่างมากบน Android ซึ่งฉันสามารถจับภาพหน้าจอของอะไรก็ได้ทุกที่ทุกเวลารวมถึงหน้าจอล็อก
Triynko

17

ข้อเท็จจริงที่ไม่ค่อยมีใครรู้จัก: ในกล่องโต้ตอบ Windows (XP) มาตรฐานส่วนใหญ่คุณสามารถกด Ctrl + C เพื่อคัดลอกเนื้อหาของกล่องโต้ตอบได้
ตัวอย่าง: เปิดไฟล์ใน Notepad กด Space ปิดหน้าต่างกด Ctrl + C ในกล่องโต้ตอบ Confirm Exit ยกเลิกวางข้อความของกล่องโต้ตอบใน Notepad
ไม่เกี่ยวข้องกับคำถามโดยตรงของคุณ แต่ฉันจะพูดถึงในหัวข้อนี้ได้ดี

นอกจากนี้คุณต้องมีซอฟต์แวร์ของบุคคลที่สามเพื่อทำภาพหน้าจอ แต่คุณไม่จำเป็นต้องเปิด Photoshop ขนาดใหญ่สำหรับสิ่งนั้น สิ่งที่ฟรีและมีน้ำหนักเบาเช่น IrfanWiew หรือ XnView สามารถทำงานได้ ฉันใช้ MWSnap เพื่อคัดลอกส่วนต่างๆของหน้าจอโดยพลการ ฉันเขียนสคริปต์ AutoHotkey เล็กน้อยที่เรียกใช้ฟังก์ชัน GDI + เพื่อทำภาพหน้าจอ เป็นต้น


เพิ่งเจอตอนนี้ ขอบคุณสำหรับเคล็ดลับนั้น
TankorSmash

เคล็ดลับที่ดี บางครั้งฉันรู้สึกผิดหวังกับกล่องโต้ตอบข้อความแสดงข้อผิดพลาดที่ไม่ยอมให้ฉันเลือกข้อความที่จะคัดลอก ด้วยเคล็ดลับนี้หลายคนทำได้! ลองใช้ในเบราว์เซอร์ของคุณที่นี่: jsfiddle.net/ ปลอบใจ / cs3jsj6p
Liam

15

ขอบคุณสำหรับซอร์สโค้ดและความคิดเห็นทั้งหมด - ด้วยเหตุนี้ในที่สุดฉันก็มีแอพที่ฉันต้องการ :)

ฉันได้รวบรวมตัวอย่างบางส่วนและทั้งแหล่งที่มาและไฟล์ปฏิบัติการสามารถพบได้ที่นี่:

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

ฉันใช้ InterceptCaptureScreen.exe - เพียงแค่เรียกใช้ในเทอร์มินัลพร้อมรับคำสั่งจากนั้นกดแทรกเมื่อคุณต้องการจับภาพหน้าจอ (ชื่อไฟล์ที่ประทับเวลา, png ในไดเร็กทอรีเดียวกับที่เรียกใช้งานได้) คีย์จะถูกจับแม้ว่าเทอร์มินัลจะไม่ได้อยู่ในโฟกัสก็ตาม

(ฉันใช้คีย์แทรกเนื่องจากควรมีเวลาในการเผยแพร่ผ่าน VNC ได้ง่ายกว่า PrintScreen ซึ่งบนแล็ปท็อปของฉันต้องการให้กดปุ่ม Fn ด้วยและไม่ได้เผยแพร่ผ่าน VNC แน่นอนว่ามันง่ายที่จะเปลี่ยนสิ่งที่ คือคีย์จริงที่ใช้ในซอร์สโค้ด)

หวังว่านี่จะช่วยได้ไชโย!


1
โปรแกรมนี้ทำงานได้อย่างสมบูรณ์ ง่ายมากและทำในสิ่งที่จำเป็น
golmschenk

2
ใช้งานได้ใน Windows 7 ด้วย ต้องการเปิดใช้งานหน้าจอในเกมแบบเต็มหน้าจอผมก็ต้องทำตามขั้นตอนเหล่านี้
metasequoia

URL ที่ตายแล้ว (ไม่น่าแปลกใจหลังจากผ่านไปเกือบทศวรรษ)
Camille Goudeseune

11

โพสต์เก่ามากฉันรู้ แต่ในที่สุด windows ก็ตระหนักว่ากระบวนการนี้เป็นอย่างไร

ใน Windows 8.1 (ตรวจสอบแล้วไม่ทำงานใน windows 7 (tnx @bobobobo))

windows key+ prnt screenบันทึกภาพหน้าจอลงในโฟลเดอร์ใน<user>/Pictures/Screenshots

ที่มา - http://windows.microsoft.com/en-in/windows/take-screen-capture-print-screen#take-screen-capture-print-screen=windows-8


มันใช้ไม่ได้ในวันที่ 7 ฉันเพิ่งลองใช้
bobobobo

@bobobobo อาขอบคุณบางที> = windows 8 แล้ว
Karthik T

มันทำงานบน windows 10 ด้วย ขอบคุณ KarthikT
Usman Hayat Khan

6

ผมอาจจะแนะนำ WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html มีตัวเลือกการบันทึกอัตโนมัติและจับภาพหน้าจอพิมพ์ alt + และชุดคีย์อื่น ๆ เพื่อจับภาพหน้าจอหน้าต่างกล่องโต้ตอบ ฯลฯ


1
อย่าลืมตรวจสอบการตั้งค่าเพื่อตั้งค่าให้ตรงตามที่คุณต้องการ
Daniel X Moore

ขอบคุณกำลังมองหาแอปที่ช่วยให้ฉันทำ Alt + Printscreen และบันทึกภาพหน้าจอไปยังเดสก์ท็อปโดยอัตโนมัติ นี้ทำงานได้อย่างสมบูรณ์
Brett

เวอร์ชันฟรีจะเพิ่มลายน้ำและจะหมดอายุหลังจาก 30 วัน Meh
Camille Goudeseune

5

ตอนนี้ Dropbox มีเบ็ดสำหรับทำสิ่งนี้โดยอัตโนมัติ หากคุณได้รับบัญชีดรอปบ็อกซ์ฟรีและติดตั้งแอปแล็ปท็อปเมื่อคุณกด PrtScr Dropbox จะให้ตัวเลือกในการจัดเก็บภาพหน้าจอทั้งหมดไปยังโฟลเดอร์ดรอปบ็อกซ์ของคุณโดยอัตโนมัติ


วิธีนี้ใช้งานได้จริงและฉันคิดว่าเป็นวิธีที่เร็วที่สุดในการจับภาพและบันทึกหน้าจอ หากเป็นคำถามของฉันฉันจะทำเครื่องหมายว่ายอมรับ
มูฮัมหมัดราฮีล

2

คุณต้องมียูทิลิตี้การดึงหน้าจอของบุคคลที่สามสำหรับฟังก์ชันนั้นใน XP กว้างขวางฉันขุด Scott Hanselman ของบล็อกเกี่ยวกับเครื่องมือเย็นและมักจะมองที่นั่นยูทิลิตี้ดังกล่าว - แน่ใจว่าพอเขา blogged เกี่ยวกับคู่ที่นี่


2

สิ่งนี้จะทำใน Delphi สังเกตการใช้ฟังก์ชัน BitBlt ซึ่งเป็นการเรียก Windows API ไม่ใช่สิ่งที่เฉพาะเจาะจงสำหรับ Delphi

แก้ไข: เพิ่มตัวอย่างการใช้งาน

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

โดยไม่ต้องติดตั้งยูทิลิตี้บันทึกภาพหน้าจอใช่คุณทำ มียูทิลิตี้หลายอย่างที่คุณสามารถพบได้อย่างไรก็ตามผู้ที่ทำสิ่งนี้

ตัวอย่างเช่นhttp://www.sc screenshot-utility.com/


แย่จังที่โบราณ ปรับปรุงล่าสุดในปี 2544
isaaclw

1

แน่นอนคุณสามารถเขียนโปรแกรมที่ตรวจสอบคลิปบอร์ดและแสดงกล่องโต้ตอบ SaveAs ที่น่ารำคาญสำหรับทุกภาพในคลิปบอร์ด ;-) ฉันเดาว่าคุณสามารถตรวจสอบได้ว่าปุ่มสุดท้ายที่กดคือ PrintScreen เพื่อ จำกัด จำนวนผลบวกปลอมหรือไม่

ในขณะที่ฉันกำลังคิดอยู่ .. คุณสามารถใช้ Google สำหรับคนที่ทำแบบนั้นอยู่แล้ว


แก้ไข : .. หรือเพียงแค่รอให้ใครบางคนโพสต์แหล่งที่มาที่นี่ - เพียงแค่ตอบ :-)


1

Snagit ... ผู้ใช้เทคโนโลยีจำนวนมากใช้สิ่งนั้น


ทำไมต้องจ่ายเงินสำหรับเครื่องมือในเมื่อสิ่งที่คุณต้องการมีเพียงการถ่ายภาพหน้าจอ?
Dane411

1

ไม่ต้องติดตั้งโปรแกรมจับภาพหน้าจอซึ่งฉันแนะนำวิธีที่ดีที่สุดคือใช้วิธีการพิมพ์หน้าจอมาตรฐานจากนั้นเปิด Microsoft Office Picture Manager และวางภาพหน้าจอลงในพื้นที่สีขาวของไดเรกทอรีที่คุณต้องการ มันจะสร้างบิตแมปที่คุณสามารถแก้ไขหรือบันทึกเป็นรูปแบบอื่นได้


แม้ว่าจะได้ผล แต่ผู้ถามอาจจะขอวิธีดำเนินการนี้โดยใช้โปรแกรม
Peter O.1

1

ขอบคุณ TheSoftwareJedi ที่ให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับ snapping tool ใน Windows 7 ทางลัดเพื่อเปิด Snipping tool: ไปที่ Start พิมพ์ sni แล้วคุณจะพบชื่อในรายการ "Snipping Tool"

ใส่คำอธิบายภาพที่นี่



0

เท่าที่ฉันรู้ใน XP ใช่คุณต้องใช้แอพอื่นเพื่อบันทึกจริง

Vista มาพร้อมกับเครื่องมือ Snipping ซึ่งช่วยลดความยุ่งยากในกระบวนการ!


0

ปรากฎว่า Google Picasa (ฟรี) จะดำเนินการให้คุณในขณะนี้ หากคุณเปิดไว้เมื่อคุณกดปุ่มจะบันทึกภาพหน้าจอเป็นไฟล์และโหลดลงใน Picasa จากประสบการณ์ของฉันมันใช้งานได้ดีมาก!



-6

เป็นไปได้ไหม:

  1. กด Alt PrintScreen
  2. เปิดโฟลเดอร์
  3. คลิกขวา -> วางภาพหน้าจอ

ตัวอย่าง:

หน้าต่างผลการเปรียบเทียบเปิดอยู่จับภาพหน้าจอ เปิด C: \ Benchmarks คลิกขวา -> วางภาพหน้าจอไฟล์ชื่อ screenshot00x.jpg จะปรากฏขึ้นพร้อมข้อความ screenshot00x ที่เลือกไว้ พิมพ์ Overclock5

แค่นั้นแหละ. ไม่ต้องเปิดอะไรมากมาย หากคุณไม่ได้เขียนอะไรเลยชื่อเริ่มต้นจะยังคงอยู่


หน้าต่างรุ่นใดที่มีรายการเมนู "วางภาพหน้าจอ" (และด้วยเนื้อหาคลิปบอร์ดที่เป็นประเภทรูปภาพจะไม่มีการเปิดใช้งานการวางใน win7)
eckes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.