在Windows XP中,可以按Alt-PrintScreen复制活动窗口的图像,或按Ctrl-PrintScreen复制整个桌面的图像。
然后可以将其粘贴到接受图像的应用程序中:Photoshop,Microsoft Word等。
我想知道:是否可以将屏幕截图直接保存到文件中? 我真的必须打开图像程序(例如Paint.net或Photoshop),只是粘贴图像然后保存吗?
在Windows XP中,可以按Alt-PrintScreen复制活动窗口的图像,或按Ctrl-PrintScreen复制整个桌面的图像。
然后可以将其粘贴到接受图像的应用程序中:Photoshop,Microsoft Word等。
我想知道:是否可以将屏幕截图直接保存到文件中? 我真的必须打开图像程序(例如Paint.net或Photoshop),只是粘贴图像然后保存吗?
Answers:
您可以编写一些非常简单的代码,将钩住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#挂钩的代码:
如果没有Windows 8之前的第三方工具,则无法直接保存到文件。这是我个人最喜欢的非第三方工具解决方案。
+ PrintScreen 将屏幕截图保存到以下位置的文件夹中<user>/Pictures/Screenshots
在win 7中,只需使用截屏工具:最容易的操作是通过按开始,然后键入“ sni”(输入)。或 然后sni enter
我使用以下键盘组合进行捕获,然后使用mspaint保存。完成几次后,只需2-3秒:
此外,Cropper很棒(而且是开源的)。它可以将矩形捕获到文件或剪贴板中,并且当然是免费的。
Win
那么w
,y
,enter
。
鲜为人知的事实:在大多数标准Windows(XP)对话框中,您可以按Ctrl + C以获得对话框内容的文本副本。
示例:在记事本中打开文件,单击空格,关闭窗口,在“确认退出”对话框中按Ctrl + C,取消,将对话框文本粘贴到记事本中。
与您的直接问题无关,但是我很高兴在此线程中提及。
的确,除了旁边,您还需要第三方软件来制作屏幕截图,但是您无需为此而触发大型Photoshop。诸如IrfanWiew或XnView之类的免费且轻量级的工具可以完成此任务。我使用MWSnap复制屏幕的任意部分。我写了一个小的AutoHotkey脚本来调用GDI +函数来截屏。等等。
感谢所有的源代码和注释-有了这些,我终于有了一个想要的应用程序:)
我已经编译了一些示例,可以在这里找到源代码和可执行文件:
http://sdaaubckp.svn.sourceforge.net/viewvc/sdaaubckp/xp-take-screenshot/
我使用InterceptCaptureScreen.exe-只需在命令提示符终端中运行它,然后在要捕获屏幕截图(带有可执行文件的同一目录中带有时间戳的文件名png)时按Insert。即使终端没有对准焦点,也会捕获键。
(我使用插入键,因为它比通过PrintScreen传播VNC的时间要短一些,例如,在笔记本电脑上,它还需要同时按下Fn键,并且不会通过VNC传播。当然,更改内容很容易是在源代码中使用的实际密钥)。
希望这会有所帮助,干杯!
我意识到这是一个很老的帖子,但是Windows终于意识到这个过程是多么愚蠢。
在Windows 8.1中(已验证,在Windows 7中不起作用(tnx @bobobobo))
windows key
+ prnt screen
将屏幕截图保存到以下位置的文件夹中<user>/Pictures/Screenshots
可能我建议使用WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html。它提供了一个自动保存选项,并捕获alt + printscreen和其他按键组合以捕获屏幕,窗口,对话框等。
您需要在XP中使用第三方屏幕抓取实用程序来实现该功能。我在斯科特·汉塞尔曼(Scott Hanselman)的博客中广泛介绍了一些很酷的工具,通常会在那儿找到这样的实用程序-的确,他在这里写了几篇关于博客的文章。
这将在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;
感谢TheSoftwareJedi在Windows 7中提供了有关快照工具的有用信息。打开快照工具的快捷方式:转到“开始”,键入sni,您将在“快照工具”列表中找到该名称。
您可能需要这样的东西:http : //addons.mozilla.org/en-US/firefox/addon/5648
我认为有一个适用于IE的版本,还具有Explorer Explorer集成。相当不错的软件。
这可能吗:
例:
基准测试结果窗口打开,截图。打开C:\ Benchmarks右键单击->粘贴屏幕截图出现一个名为screenshot00x.jpg的文件,并选择了文本screenshot00x。类型超频5
而已。无需打开任何东西。如果您什么都不写,则保留默认名称。