Как сохранить скриншот непосредственно в файл в Windows?

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

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

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

Ответ 1

Вы можете закодировать что-то довольно простое, которое закрепит 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 (и другого ключа) к С#:

Код ключа

Ответ 2

Невозможно сохранить непосредственно файл без стороннего инструмента до Windows 8. Вот мои личные любимые решения сторонних разработчиков.

Для Windows 8 и более поздних версий

Windows Key + PrintScreen сохраняет снимок экрана в папку <user>/Pictures/Screenshots

Для Windows 7

В win 7 просто используйте инструмент для обрезки: наиболее легко получить доступ, нажав "Старт", затем набрав "sni" ​​(введите). или Windows Key, затем s n i enter

Предыдущие версии Windows

Я использую следующую комбинацию клавиш для захвата, а затем сохраняю с помощью mspaint. После того, как вы сделаете это пару раз, это займет всего 2-3 секунды:

  • Alt + PrintScreen
  • Win + R ( "run" )
  • введите "mspaint" enter
  • Ctrl - V (вставить)
  • Ctrl - s (сохранить)
  • использовать диалог с файлом
  • Alt - F4 (закрыть mspaint)

Кроме того, Cropper отлично (и с открытым исходным кодом). Он делает захват прямоугольника в файл или буфер обмена и, конечно, свободен.

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

Очень старый пост, который я понимаю, но окна наконец поняли, насколько безумным был процесс.

В 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

Ответ 6

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

Ответ 7

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

Ответ 8

Вам нужна сторонняя утилита для захвата экрана для этой функциональности в XP. Я копаю Скотта Гензельмана обширный блог о крутых инструментах и обычно смотрю там на такую ​​утилиту - достаточно уверен, он написал о парах здесь.

Ответ 9

Это будет сделано в 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;

Ответ 10

Без установки утилиты автосохранения снимков экрана, да, вы это делаете. Есть несколько утилит, которые вы можете найти, однако, делая это.

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

Ответ 11

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

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


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

Ответ 12

Snagit... многие технические люди используют это.

Ответ 13

Попробуйте следующее: http://www.screenshot-utility.com/

На главной странице:

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

Ответ 14

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

enter image description here

Ответ 15

Держите Picasa в фоновом режиме и просто нажмите кнопку "Печать экрана"

Источник

Ответ 16

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

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

Ответ 17

Вам может понадобиться что-то вроде этого: http://addons.mozilla.org/en-US/firefox/addon/5648

Я думаю, что есть версия для IE, а также с Explorer Integration. Довольно хорошее программное обеспечение.

Ответ 18

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

Ответ 19

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

Ответ 20

Возможно ли это:

  • Нажмите Alt PrintScreen
  • Откройте папку
  • Щелкните правой кнопкой мыши → вставить снимок экрана

Пример:

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

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