Как сохранить снимок экрана прямо в файл в Windows? [закрыто]


115

В Windows XP можно нажать Alt-PrintScreen, чтобы скопировать изображение активного окна, или Ctrl-PrintScreen, чтобы скопировать изображение всего рабочего стола.

Затем его можно вставить в приложения, которые принимают изображения: Photoshop, Microsoft Word и т. Д.

Мне интересно: есть ли способ сохранить скриншот прямо в файл? Мне действительно нужно открывать программу обработки изображений, например Paint.net или Photoshop, просто чтобы вставить изображение, а затем сохранить его?


14
Photoshop ?? Почему бы не использовать mspaint или paint.net? Зачем использовать что-то тяжелое, как фотошоп ??
ГЕОЧЕТ 01

1
Лучшее, что я здесь получил, - это скриншот слова со скриншотом сообщения об ошибке, вставленного непосредственно в HTML-письмо.
VVS

1
Пожалуйста, взгляните на мой ответ, НАКОНЕЦ возможно сделать это по крайней мере так же легко, как Mac (поток Linux еще лучше)
Картик Т.

1
Помечено для перехода к SuperUser. Хотя принятый ответ оказался программным, как написано, этот вопрос искал общий ответ на использование компьютера и поэтому относится к SuperUser.
ArtOfWarfare

1
Привет, может быть, немного поздно для ответа, но это может помочь другим с аналогичной проблемой. В Магазине Windows есть приложение, с помощью которого вы можете сохранить снимок экрана из буфера обмена во временное изображение на диске и вернуть путь к файлу, так что вы можете использовать его простым ctrl + v в любом приложении ( microsoft. com / store / apps / 9PM34S06CFVJ ). Вам больше не нужно будет открывать другое программное обеспечение, чтобы сохранить снимок экрана в файл.
Джованни Эспозито

Ответы:


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 format = ImageFormat.Gif; вы можете просто установить ImageFormat format = ImageFormat.PNG; или формат ImageFormat = ImageFormat.JPG; Все здесь для вас
Патрик Дежарден

4
Хорошо, что мне делать с этим фрагментом? выполнить его и нажимать экран печати каждый раз, когда мне нужен снимок экрана, или только один раз? помимо его компиляции?
Jaime Hablutzel

3
У кого-нибудь был бинарник?
Тимофей Трофимов

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
На самом деле это на удивление быстро и легко. Кроме того, если вы делаете серию снимков, вы можете оставить Paint открытой и использовать Ctrl-N, чтобы сбрасывать область рисования, и Ctrl-S, чтобы сохранить ее (нет необходимости в «Сохранить как»). Еще одно преимущество открытия Paint заключается в том, что он запоминает выбранный вами формат файла для сохранения (например, PNG).
Нил Мэйхью

1
Спасибо, @Neil. Я обновил этот ответ с помощью Ctrl-S и новых функций win 7.
TheSoftwareJedi

1
ключ windows + "сни" FTW!
Джейсон

Обратите внимание, что это работает только для английского языка. Для польского инструмент назван Narzędzie Wycinanie и работает аналогично: Winто w, y, enter.
maciek

Не работает на экране блокировки, поэтому не годится для захвата этих крутых фонов Windows. Очень сильно отличается от Android, где я могу сделать снимок экрана чего угодно и когда угодно, включая экран блокировки.
Трийнко

17

Малоизвестный факт: в большинстве стандартных диалогов Windows (XP) вы можете нажать Ctrl + C, чтобы получить текстовую копию содержимого диалогового окна.
Пример: откройте файл в Блокноте, нажмите пробел, закройте окно, нажмите Ctrl + C в диалоговом окне «Подтвердить выход», отмените, вставьте в Блокнот текст диалогового окна.
Не имеет отношения к вашему прямому вопросу, но мне хотелось бы упомянуть в этой теме.

Кроме того, действительно, вам понадобится стороннее программное обеспечение для создания снимков экрана, но вам не нужно запускать для этого большой Photoshop. Что-то бесплатное и легкое, например IrfanWiew или XnView, может сделать эту работу. Я использую MWSnap для копирования произвольных частей экрана. Я написал небольшой скрипт AutoHotkey, вызывающий функции GDI + для создания снимков экрана. И т.п.


Только что нашел это сейчас. Спасибо за совет.
ТанкорСмаш 02

Хороший совет. Иногда меня разочаровывают диалоговые окна с сообщениями об ошибках, которые не позволяют мне выбрать текст для копирования. С этим советом многие из них делают! Попробуйте это в своем браузере здесь: jsfiddle.net/liamhennessy/cs3jsj6p
Лиам

15

Спасибо за исходный код и комментарии - благодаря этому у меня наконец-то есть приложение, которое я хотел :)

Я собрал несколько примеров, и здесь можно найти как исходники, так и исполняемые файлы:

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

Я использую InterceptCaptureScreen.exe - просто запустите его в терминале командной строки, а затем нажмите Insert, если вы хотите сделать снимок экрана (имена файлов с меткой времени, png, в том же каталоге, где находится исполняемый файл); ключи будут захвачены, даже если терминал не в фокусе.

(Я использую клавишу Insert, так как ей должно быть легче распространяться, скажем, через VNC, чем через PrintScreen - что на моем ноутбуке требует, чтобы также была нажата клавиша Fn, и это не распространяется через VNC. Конечно, легко изменить то, что фактический ключ, используемый в исходном коде).

Надеюсь, это поможет, ура!


1
Эта программа работает отлично. Очень просто и делает именно то, что нужно.
golmschenk

2
Также работает в Windows 7. Чтобы включить скриншоты в полноэкранной игре, мне пришлось выполнить следующие действия .
metasequoia

Мертвый URL. (Неудивительно, спустя почти десять лет.)
Камилла Гудесун

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

его работа на Windows 10 тоже. Спасибо KarthikT
Усман Хаят Хан

6

Могу я предложить WinSnap http://www.ntwind.com/software/winsnap/download-free-version.html . Он предоставляет возможность автосохранения и захвата экрана печати alt + и других комбинаций клавиш для захвата экрана, окон, диалогов и т. Д.


1
Обязательно проверьте настройки, чтобы настроить именно так, как вы хотите.
Дэниел Икс Мур,

Спасибо, искал приложение, которое позволило бы мне использовать Alt + Printscreen и автоматически сохранять снимок экрана на рабочий стол. Это прекрасно работает.
Бретт

Бесплатная версия добавляет водяной знак, и срок ее действия истекает через 30 дней. Мех.
Camille Goudeseune

5

Dropbox теперь позволяет делать это автоматически. Если вы получите бесплатную учетную запись Dropbox и установите приложение для ноутбука, при нажатии PrtScr Dropbox предоставит вам возможность автоматически сохранять все снимки экрана в папку Dropbox.


Это действительно сработало, и я думаю, что это самый быстрый способ сделать снимок и сохранить экран. Если бы это был мой вопрос, я бы пометил его как принимающий.
Мухаммад Рахил,


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;

2

Попробуйте это: http://www.screenshot-utility.com/

Со своей домашней страницы:

Когда вы нажимаете горячую клавишу, он делает снимок экрана и сохраняет его в файл JPG, GIF или BMP.


1

Да, без установки утилиты автосохранения скриншотов. Однако есть несколько утилит, которые делают это.

Например: http://www.screenshot-utility.com/


Ой, жаль, что это древнее. Последнее обновление: 2001.
isaaclw 01

1

Конечно, вы можете написать программу, которая следит за буфером обмена и отображает надоедливый диалог SaveAs для каждого изображения в буфере обмена ;-). Я думаю, вы даже можете узнать, была ли последняя нажатая клавиша PrintScreen, чтобы ограничить количество ложных срабатываний.

Пока я думаю об этом ... вы также можете погуглить для тех, кто уже сделал именно это.


РЕДАКТИРОВАТЬ : .. или просто подождите, пока кто-нибудь опубликует здесь источник - как только получилось :-)


1

Снагит ... многие технические специалисты этим пользуются.


зачем платить за инструмент, когда все, что вам нужно, это просто сделать снимок экрана?
Dane411

1

За исключением установки программы захвата экрана, которую я рекомендую, лучший способ сделать это - использовать стандартный метод Print Screen, затем открыть Microsoft Office Picture Manager и просто вставить снимок экрана в белую область нужного вам каталога. Он создаст растровое изображение, которое вы можете редактировать или сохранять в другом формате.


Хотя это может сработать, скорее всего, спрашивающий просит способ сделать это программно.
Питер О.

1

Благодарим TheSoftwareJedi за предоставление полезной информации об инструменте привязки в Windows 7. Ярлык для открытия инструмента Snipping: перейдите в Пуск, введите sni И вы найдете имя в списке «Snipping Tool»

введите описание изображения здесь



0

Насколько я знаю в XP, да, вы должны использовать какое-нибудь другое приложение, чтобы его действительно сохранить.

Vista поставляется с инструментом Snipping Tool, который немного упрощает процесс!


0

Оказывается, Google Picasa (бесплатно) сделает это за вас сейчас. Если он открыт, при нажатии он сохранит снимок экрана в файл и загрузит его в Picasa. По моему опыту, он отлично работает!



-6

Это возможно:

  1. Нажмите Alt PrintScreen
  2. Открыть папку
  3. Щелкните правой кнопкой мыши -> вставить снимок экрана

Пример:

Окно результатов теста открыто, сделайте снимок экрана. Откройте C: \ Benchmarks. Щелкните правой кнопкой мыши -> Вставить снимок экрана. Появится файл с именем screenshot00x.jpg с выбранным текстом screenshot00x. Тип Overclock5

Это оно. Не нужно ничего открывать. Если вы ничего не напишите, останется имя по умолчанию.


в какой версии Windows есть пункт меню «вставить снимок экрана»? (а с содержимым буфера обмена типа image вставка в win7 не активирована).
eckes
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.