如何将屏幕截图直接保存到Windows中的文件?[关闭]


115

在Windows XP中,可以按Alt-PrintScreen复制活动窗口的图像,或按Ctrl-PrintScreen复制整个桌面的图像。

然后可以将其粘贴到接受图像的应用程序中:Photoshop,Microsoft Word等。

我想知道:是否可以将屏幕截图直接保存到文件中?真的必须打开图像程序(例如Paint.net或Photoshop),只是粘贴图像然后保存吗?


14
Photoshop ?? 为什么不使用mspaint或paint.net?为什么要使用像photoshop一样重的东西?
GEOCHET

1
我得到的最好的是word的屏幕快照,其中包含一些直接粘贴到HTML邮件中的错误消息的屏幕快照。
VVS

1
请看一下我的回答,它完全有可能像Mac一样轻松地完成(尽管Linux的运行情况仍然更好)
Karthik T 2013年

1
标记为移交给SuperUser。尽管接受的答案最终成为编程的答案,但该问题正在寻找通用的计算机使用答案,因此属于SuperUser。
ArtOfWarfare 2014年

1
嗨,也许答案来得有点晚,但可以帮助遇到类似问题的其他人。Windows应用商店中有一个应用程序,您可以使用该应用程序将剪贴板中的屏幕截图图像保存到磁盘上的临时图像中,并返回文件的路径,因此您可以在任何应用程序中将其与简单的ctrl + v一起使用(Microsoft。 com / store / apps / 9PM34S06CFVJ)。您无需再打开其他软件即可将屏幕截图保存到文件中。
Giovanni Esposito

Answers:


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 format = ImageFormat.PNG; 或ImageFormat format = ImageFormat.JPG; 一切都在您身边
Patrick Desjardins

4
好的,该代码段该怎么办?执行它,然后每当我需要屏幕截图时按打印屏幕,或者仅一次?除了编译之外?
Jaime Hablutzel 2012年

3
有人有二进制文件吗?
Timofey Trofimov,2015年

2
我认为这不是“非常简单”
。– hejdav

153

如果没有Windows 8之前的第三方工具,则无法直接保存到文件。这是我个人最喜欢的非第三方工具解决方案。

对于Windows 8和更高版本

Windows Key+ PrintScreen 将屏幕截图保存到以下位置的文件夹中<user>/Pictures/Screenshots

对于Windows 7

在win 7中,只需使用截屏工具:最容易的操作是通过按开始,然后键入“ sni”(输入)。或 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
实际上,这出奇的快捷和容易。另外,如果要拍摄一系列照片,可以将“绘画”保持打开状态,并使用Ctrl-N保持重置绘画区域,并使用Ctrl-S进行保存(不需要另存为)。保持Paint打开的另一个好处是,它可以记住您选择的文件格式来保存(例如PNG)。
尼尔·梅休

1
谢谢@尼尔。我使用Ctrl-S和新的win 7功能更新了此答案。
TheSoftwareJedi 2010年

1
Windows键+“ SNI” FTW!
杰森

请注意,它仅适用于英语语言环境。波兰工具被命名为NarzędzieWycinanie和工程类比:Win那么wyenter
maciek

在锁定屏幕上不起作用,因此不利于捕获那些很酷的Windows背景。与Android截然不同的是,Android可以随时捕获任何屏幕截图,包括锁定屏幕。
Triynko

17

鲜为人知的事实:在大多数标准Windows(XP)对话框中,您可以按Ctrl + C以获得对话框内容的文本副本。
示例:在记事本中打开文件,单击空格,关闭窗口,在“确认退出”对话框中按Ctrl + C,取消,将对话框文本粘贴到记事本中。
与您的直接问题无关,但是我很高兴在此线程中提及。

的确,除了旁边,您还需要第三方软件来制作屏幕截图,但是您无需为此而触发大型Photoshop。诸如IrfanWiew或XnView之类的免费且轻量级的工具可以完成此任务。我使用MWSnap复制屏幕的任意部分。我写了一个小的AutoHotkey脚本来调用GDI +函​​数来截屏。等等。


刚刚发现这个。感谢您的提示。
TankorSmash 2012年

不错的提示。有时我对错误消息对话框感到沮丧,因为这些错误消息对话框不允许我选择要复制的文本。有了这个技巧,其中许多人都可以做到!在以下浏览器中尝试:jsfiddle.net/liamhennessy/cs3jsj6p
Liam,

15

感谢所有的源代码和注释-有了这些,我终于有了一个想要的应用程序:)

我已经编译了一些示例,可以在这里找到源代码和可执行文件:

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

我使用InterceptCaptureScreen.exe-只需在命令提示符终端中运行它,然后在要捕获屏幕截图(带有可执行文件的同一目录中带有时间戳的文件名png)时按Insert。即使终端没有对准焦点,也会捕获键。

(我使用插入键,因为它比通过PrintScreen传播VNC的时间要短一些,例如,在笔记本电脑上,它还需要同时按下Fn键,并且不会通过VNC传播。当然,更改内容很容易是在源代码中使用的实际密钥)。

希望这会有所帮助,干杯!


1
该程序运行完美。非常简单,可以完成所需的工作。
golmschenk

2
在Windows 7中也可以使用。要在全屏游戏中启用屏幕截图,我必须遵循以下步骤
水杉2013年

无效网址。(近十年来就不足为奇了。)
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 2014年

它也可以在Windows 10上使用。感谢KarthikT
Usman Hayat Khan

6

可能我建议使用WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html。它提供了一个自动保存选项,并捕获alt + printscreen和其他按键组合以捕获屏幕,窗口,对话框等。


1
请务必检查设置以使其完全按照您的要求进行设置。
Daniel X Moore

谢谢您,一直在寻找一款能让我执行Alt + Printscreen并将屏幕截图自动保存到桌面的应用程序。这很完美。
布雷特(Brett)

免费版会添加水印,并在30天后过期。嗯
卡米尔·古德塞内

5

现在,Dropbox提供了自动执行此操作的挂钩。如果您拥有免费的保管箱帐户并安装笔记本电脑应用程序,则在按PrtScr时,保管箱将为您提供自动将所有屏幕截图存储到保管箱文件夹的选项。


这实际上是有效的,我认为这是捕获和保存屏幕的最快方法。如果这是我的问题,我将其标记为接受。
穆罕默德·拉希尔


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

当然,您可以编写一个程序来监视剪贴板,并为剪贴板中的每个图像显示烦人的SaveAs对话框;-)。我猜您甚至可以找出是否最后按下的键是PrintScreen来限制误报的数量。

当我在考虑它时..您也可以用Google搜索已经做到这一点的人。


编辑:..或只是等待某人在此处发布源代码-刚发生的情况:-)


1

Snagit ...很多技术人员都使用它。


当您只想截图时,为什么要为工具付费?
Dane411

1

缺少安装屏幕截图程序的建议,最好的方法是使用标准的“打印屏幕”方法,然后打开Microsoft Office Picture Manager,然后将屏幕截图粘贴到所需目录的白色区域。它将创建一个位图,您可以对其进行编辑或另存为其他格式。


尽管这可能可行,但请求者很可能会要求以编程方式进行此操作。
彼得O.

1

感谢TheSoftwareJedi在Windows 7中提供了有关快照工具的有用信息。打开快照工具的快捷方式:转到“开始”,键入sni,您将在“快照工具”列表中找到该名称。

在此处输入图片说明



0

据我在XP中所知,是的,您必须使用其他一些应用程序才能真正保存它。

Vista附带了Snipping工具,可简化流程!


0

事实证明,Google Picasa(免费)现在将为您执行此操作。如果您将其打开,则单击它会将屏幕快照保存到文件中,并将其加载到Picasa中。以我的经验,效果很好!



-6

这可能吗:

  1. 按Alt PrintScreen
  2. 开启资料夹
  3. 右键单击->粘贴屏幕截图

例:

基准测试结果窗口打开,截图。打开C:\ Benchmarks右键单击->粘贴屏幕截图出现一个名为screenshot00x.jpg的文件,并选择了文本screenshot00x。类型超频5

而已。无需打开任何东西。如果您什么都不写,则保留默认名称。


哪个Windows版本具有“粘贴屏幕截图”菜单项?(并且对于剪贴板类型为image的内容,在win7中没有激活粘贴)。
eckes 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.