Как сохранить скриншот непосредственно в файл в Windows?
В Windows XP можно нажать Alt-PrintScreen, чтобы скопировать изображение активного окна, или Ctrl-PrintScreen, чтобы скопировать изображение полного рабочего стола.
Затем его можно вставить в приложения, которые принимают изображения: Photoshop, Microsoft Word и т. Д.
Мне интересно: есть ли способ сохранить скриншот прямо в файл? Неужели мне действительно нужно открыть программу для обработки изображений, например Paint.net или Photoshop, просто вставить изображение и сохранить его?
20 ответов
Вы можете написать что-то довольно простое, что перехватит 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. Вот мои личные любимые решения сторонних инструментов.
Для Windows 8 и более поздних версий
+ PrintScreen сохраняет скриншот в папку в <user>/Pictures/Screenshots
Для Windows 7
В Win 7 просто используйте инструмент для разрезания: проще всего получить доступ через нажатие кнопки "Пуск" и ввод "sni" (ввод). или же тогда я вхожу
Предыдущие версии Windows
Я использую следующую комбинацию клавиш для захвата, затем сохраняю, используя mspaint. После того, как вы сделаете это пару раз, это займет всего 2-3 секунды:
- Alt + PrintScreen
- Win + R ("запустить")
- введите "mspaint" введите
- Ctrl - V (вставить)
- Ctrl - S (сохранить)
- использовать файл диалога
- Alt - F4 (закрыть mspaint)
Кроме того, Кроппер отлично (и с открытым исходным кодом). Это делает захват прямоугольника в файл или буфер обмена, и, конечно, бесплатно.
Малоизвестный факт: в большинстве стандартных диалогов 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, в том же каталоге, где находится исполняемый файл); ключи будут захвачены, даже если терминал не в фокусе.
(Я использую клавишу вставки, так как она должна проходить легче, скажем, через VNC, чем PrintScreen - что на моем ноутбуке требует, чтобы также была нажата клавиша Fn, а это не распространяется через VNC. Конечно, легко изменить то, что фактический ключ, используемый в исходном коде).
Надеюсь, это поможет, ура!
Очень старый пост, я понимаю, но 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
Могу ли я предложить WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html. Он предоставляет опцию автосохранения и захватывает alt+printscreen и другие комбинации клавиш для захвата экрана, окон, диалогов и т. Д.
Dropbox теперь предоставляет возможность сделать это автоматически. Если вы получаете бесплатную учетную запись Dropbox и устанавливаете приложение для ноутбука, при нажатии PrtScr Dropbox предоставит вам возможность автоматически сохранять все снимки экрана в папку Dropbox.
Это сделает это в Delphi. Обратите внимание на использование функции BitBlt, которая является вызовом API Windows, а не чем-то специфичным для 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;
Вам нужна сторонняя утилита захвата экрана для этой функциональности в XP. Я копаю обширные блоги Скотта Хансельмана о крутых инструментах и обычно ищу там такую утилиту - конечно же, он писал о паре здесь.
Попробуйте это: http://www.screenshot-utility.com/
С их домашней страницы:
Когда вы нажимаете горячую клавишу, она захватывает и сохраняет снимок экрана в файл JPG, GIF или BMP.
Кроме установки программы захвата экрана, которую я рекомендую, лучший способ сделать это - использовать стандартный метод Print Screen, затем открыть Microsoft Office Picture Manager и просто вставить снимок экрана в белую область нужного вам каталога. Это создаст растровое изображение, которое вы можете редактировать или сохранить в другом формате.
Конечно, вы могли бы написать программу, которая следит за буфером обмена и отображает раздражающее диалоговое окно SaveAs для каждого изображения в буфере обмена;-). Я думаю, вы даже можете узнать, была ли последняя нажатая клавиша PrintScreen для ограничения количества ложных срабатываний.
Пока я думаю об этом.. вы также можете поискать кого-то, кто уже сделал именно это.
РЕДАКТИРОВАТЬ:.. или просто подождите, пока кто-нибудь опубликует источник здесь - как это случилось:-)
Запустите Picasa в фоновом режиме и просто нажмите кнопку "Печать экрана"
Без установки скриншота утилиты автосохранения, да, вы делаете. Есть несколько утилит, которые вы можете найти, однако следующие делают это.
Например: http://www.screenshot-utility.com/
Спасибо TheSoftwareJedi за предоставление полезной информации об инструменте привязки в Windows 7. Ярлык, чтобы открыть инструмент Snipping: Перейдите в Пуск, введите sni И вы найдете имя в списке "Инструмент Snipping"
Оказывается, Google Picasa (бесплатно) сделает это за вас сейчас. Если он открыт, при нажатии он сохранит снимок экрана в файл и загрузит его в Picasa. По моему опыту, это прекрасно работает!
Насколько я знаю в XP, да, вы должны использовать какое-то другое приложение, чтобы сохранить его.
Vista поставляется с инструментом Snipping, который немного упрощает процесс!
Вы можете захотеть что-то вроде этого: http://addons.mozilla.org/en-US/firefox/addon/5648
Я думаю, что есть версия для IE, а также с Explorer Integration. Довольно хорошее программное обеспечение.
Это возможно:
- Нажмите Alt PrintScreen
- Открыть папку
- Щелкните правой кнопкой мыши -> вставить скриншот
Пример:
Откроется окно результатов теста, сделайте скриншот. Откройте C:\Benchmarks. Щелкните правой кнопкой мыши -> Вставить снимок экрана. Появится файл с именем screenshot00x.jpg с выделенным текстом screenshot00x. Тип Оверклок5
Это оно. Не нужно ничего открывать. Если вы ничего не пишете, имя по умолчанию остается.