117

是否有一种一键式方法可以将屏幕截图直接保存到 Windows 中的文件中?


TheSoftwareJedi 为 Windows 8 和 10 准确回答了上述问题。以下原始额外材料留给后代。

这是一个非常重要的问题,因为截至 2021 年的 316K 视图显示。在 2008 年被问到,SO 在 2015 年左右关闭了这个问题,因为它离题了,可能是因为下面的最后一个问题。

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

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

我想知道:有没有办法将屏幕截图直接保存到文件中?真的必须打开一个图像程序,比如 Paint.net 或 Photoshop,来粘贴图像,然后保存吗?

4

20 回答 20

155

在 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很棒(而且是开源的)。它可以将矩形捕获到文件或剪贴板,当然是免费的。

于 2008-10-01T15:41:52.357 回答
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);
}

更新 这是从 C# 挂钩 PrintScreen (和其他键)的代码:

挂钩代码

于 2008-10-01T15:21:28.973 回答
17

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

此外,确实,您需要第三方软件来制作屏幕截图,但您不需要为此启动大型 Photoshop。像 IrfanWiew 或 XnView 这样免费且轻量级的东西可以完成这项工作。我使用 MWSnap 复制屏幕的任意部分。我写了一个小 AutoHotkey 脚本调用 GDI+ 函数来做截图。等等。

于 2008-10-01T15:59:26.917 回答
15

感谢所有源代码和评论 - 多亏了这一点,我终于有了一个我想要的应用程序 :)

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

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

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

(我使用 Insert 键,因为它应该更容易通过 VNC 传播而不是 PrintScreen - 在我的笔记本电脑上,它还要求按下 Fn 键,并且不会通过 VNC 传播。当然,它很容易改变什么是源代码中使用的实际密钥)。

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

于 2010-04-29T08:02:16.930 回答
12

我意识到非常旧的帖子,但 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

于 2013-12-30T13:28:02.850 回答
6

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

于 2008-10-10T04:46:26.950 回答
4

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

于 2014-02-17T15:58:19.140 回答
2

您需要一个第三方屏幕抓取实用程序才能在 XP 中实现该功能。我挖掘了 Scott Hanselman关于酷工具的大量博客,并且通常会在那里寻找这样的实用程序——果然,他在博客上写了一些关于很酷工具。

于 2008-10-01T15:24:08.873 回答
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;
于 2008-10-01T16:12:25.203 回答
2

试试这个:http ://www.screenshot-utility.com/

从他们的主页:

当您按下热键时,它会捕获屏幕快照并将其保存为 JPG、GIF 或 BMP 文件。

于 2008-10-01T17:27:41.463 回答
1

如果不安装屏幕截图自动保存实用程序,是的。但是,您可以找到几个实用程序来执行此操作。

例如:http ://www.screenshot-utility.com/

于 2008-10-01T15:20:16.153 回答
1

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

虽然我正在考虑它..你也可以谷歌搜索已经这样做的人。


编辑:..或者只是等待有人在这里发布源 - 就像刚刚发生的那样:-)

于 2008-10-01T15:22:15.417 回答
1

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

于 2008-10-01T15:37:06.923 回答
1

除了我推荐的安装屏幕捕获程序之外,最好的方法是使用标准的 Print Screen 方法,然后打开 Microsoft Office 图片管理器并将屏幕截图粘贴到您想要的目录的白色区域中。它将创建一个位图,您可以对其进行编辑或另存为另一种格式。

于 2011-06-03T13:48:57.177 回答
1

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

在此处输入图像描述

于 2014-04-22T03:40:57.947 回答
1

让 Picasa 在后台运行,只需单击“打印屏幕”键

来源

于 2015-05-30T06:25:43.403 回答
0

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

Vista 带有截图工具,可以稍微简化一下流程!

于 2008-10-01T15:17:49.640 回答
0

你可能想要这样的东西:http: //addons.mozilla.org/en-US/firefox/addon/5648

我认为有一个 IE 版本,也有 Explorer 集成。很不错的软件。

于 2008-10-01T15:40:05.810 回答
0

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

于 2012-12-05T22:17:16.640 回答
-6

这可能吗:

  1. 按 Alt 打印屏幕
  2. 打开一个文件夹
  3. 右键->粘贴截图

例子:

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

就是这样。无需打开任何东西。如果您不写任何内容,则保留默认名称。

于 2011-10-09T18:29:06.917 回答