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

时间:2008-10-01 15:16:54

标签: windows screenshot

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

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

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

20 个答案:

答案 0 :(得分:148)

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

对于Windows 8及更高版本

Windows Key + PrintScreen 将屏幕截图保存到<user>/Pictures/Screenshots

中的文件夹中

对于Windows 7

在win 7中,只需使用剪切工具:最容易通过按Start键进入,然后键入“sni”(输入)。要么 Windows Key 然后 s n i 输入

Windows的早期版本

我使用以下键盘组合进行捕获,然后使用mspaint进行保存。在你做了几次之后,它只需要2-3秒:

  1. Alt + PrintScreen
  2. 赢取 + R (“跑步”)
  3. 输入“mspaint”输入
  4. Ctrl - V (粘贴)
  5. Ctrl - S (保存)
  6. 使用文件对话框
  7. Alt - F4 (关闭mspaint)
  8. 此外,Cropper很棒(和开源)。它将矩形捕获到文件或剪贴板,当然是免费的。

答案 1 :(得分: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(和其他键)的代码:

Hook code

答案 2 :(得分:17)

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

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

答案 3 :(得分:15)

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

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

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

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

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

希望这有帮助, 干杯!

答案 4 :(得分: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

答案 5 :(得分:6)

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

答案 6 :(得分:5)

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

答案 7 :(得分:2)

您需要在XP中使用第三方屏幕抓取工具来实现该功能。我挖掘了斯科特汉塞尔曼的广泛blogging about cool tools并且通常会在那里寻找这样一个实用程序 - 当然,他在博客上写了几个here

答案 8 :(得分: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;

答案 9 :(得分:2)

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

从他们的主页:

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

答案 10 :(得分:1)

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

即可

Source

答案 11 :(得分:1)

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

enter image description here

答案 12 :(得分:1)

如果没有安装屏幕捕获程序,我建议,最好的方法是使用标准的Print Screen方法,然后打开Microsoft Office Picture Manager,只需将屏幕截图粘贴到您所在目录的白色区域即可。欲望。它将创建一个可以编辑或保存的位图 - 作为不同的格式。

答案 13 :(得分:1)

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

答案 14 :(得分:1)

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

虽然我正在考虑这个问题......你也可以谷歌为那些已经做到这一点的人辩护。


编辑:..或者只是等待有人在这里发布消息来源 - 正如刚刚发生的那样: - )

答案 15 :(得分:1)

没有安装屏幕截图自动保存实用程序,是的。但是你可以找到几个实用工具。

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

答案 16 :(得分:0)

您可能想要这样的内容:http://addons.mozilla.org/en-US/firefox/addon/5648

我认为IE版本和Explorer Integration版本都有。非常好的软件。

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

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

答案 19 :(得分:-6)

这可能吗:

  1. 按Alt PrintScreen
  2. 打开文件夹
  3. 右键单击 - &gt;粘贴截图
  4. 示例:

    基准测试结果窗口打开,截屏。 打开C:\ Benchmarks 右键单击 - &gt;粘贴截图 将出现名为screenshot00x.jpg的文件,并选中文本screenshot00x。 输入Overclock5

    多数民众赞成。无需打开任何东西。如果您不写任何内容,则保留默认名称。