Як я можу зберегти скріншот безпосередньо у файл у Windows? [зачинено]


115

У Windows XP можна натиснути Alt-PrintScreen, щоб скопіювати зображення активного вікна, або Ctrl-PrintScreen, щоб скопіювати зображення з повного робочого столу.

Потім їх можна вставити у програми, які приймають зображення: Photoshop, Microsoft Word тощо.

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


14
Фотошоп ?? Чому б не використовувати mspaint або paint.net? Навіщо використовувати щось таке важке, як фотошоп ??
ГЕОЧЕТ

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

1
Погляньте, будь ласка, на мою відповідь, НАЗВІЛЬНО це можна зробити якнайменше так просто, як Mac (хоча потік Linux все ще краще)
Karthik T

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

4
Гаразд, що мені робити з цим фрагментом? виконати його та натиснути екран друку кожного разу, коли мені потрібно скріншот, або лише один раз? крім її складання?
Хайме Хаблуцель

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 + "sni" FTW!
Джейсон

Зауважте, що він працює лише для англійської мови. Для польського інструмент названий Narzędzie Wycinanie і працює аналогічно: Winто w, y, enter.
maciek

Не працює на блокованому екрані, тому немає користі для зйомки цих крутих фонів Windows. Дуже на відміну від Android, на якому я можу зробити знімок екрана будь-чого, в будь-який час, включаючи екран блокування.
Трайнко

17

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

Окрім цього, для створення скріншоту вам потрібно програмне забезпечення сторонніх виробників, але для цього вам не потрібно запускати великий Photoshop. Щось вільне і легке, як IrfanWiew або XnView, може зробити цю роботу. Я використовую MWSnap для копіювання довільних частин екрана. Я написав невеликий сценарій AutoHotkey, який закликав GDI + функції робити знімки екрана. І т.д.


Щойно знайшов це зараз. Дякую за цю пораду.
TankorSmash

Гарна порада. Іноді мене засмучують діалоги повідомлень про помилки, які не дають мені вибрати текст для копіювання. З цією порадою багато хто з них робить! Спробуйте у своєму браузері тут: jsfiddle.net/liamhennessy/cs3jsj6p
Ліам

15

Дякую за весь вихідний код та коментарі - завдяки цьому, нарешті, у мене є додаток, який я хотів :)

Я склав деякі приклади, і джерела, і виконавчі файли можна знайти тут:

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

Я використовую InterceptCaptureScreen.exe - просто запустіть його в терміналі командного рядка, а потім натисніть Вставити, коли ви хочете зробити знімок екрана екрана (назви файлів часу, 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
Usman Hayat Khan

6

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


1
Не забудьте перевірити налаштування, щоб налаштувати його саме так, як вам потрібно.
Даніель Х Мур

Дякую, шукав додаток, який міг би дозволити мені робити Alt + Printscreen і автоматично зберігати скріншот на робочий стіл. Це прекрасно працює.
Бретт

Безкоштовна версія додає водяний знак і закінчується через 30 днів. Мех.
Camille Goudeseune

5

Тепер Dropbox забезпечує гачок, щоб зробити це автоматично. Якщо ви отримаєте безкоштовний обліковий запис Dropsbox і встановите додаток для ноутбука, після натискання кнопки PrtScr Dropbox надасть вам можливість автоматично зберігати всі знімки екрана у папці dropbox.


Це фактично спрацювало, і я думаю, що це найшвидший спосіб захоплення та збереження екрана. Якби це було моє питання, я би позначив це як прийняття.
Мухаммад Рахіль


2

Це зробить це в 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;


1

Не встановлюючи утиліту автоматичного збереження екрана, так, ви робите. Існує кілька утиліт, які ви можете знайти, однак, як це зробити.

Наприклад: http://www.screenshot-utility.com/


Ах, занадто погано, що давнє. Останнє оновлення у 2001 р.
isaaclw

1

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

Поки я думаю про це, ти також можеш google для того, хто вже робив саме це.


РЕДАКТУВАТИ : .. або просто чекайте, коли хтось опублікує джерело тут - як просто відбулося :-)


1

Snagit ... цим користуються багато людей.


чому платити за інструмент, коли все, що ти хочеш, - це просто зробити знімок екрана?
Dane411

1

Якщо не рекомендується встановити програму зйомки екрана, яку я рекомендую, найкращий спосіб це зробити за допомогою стандартного методу друку, а потім відкрити Microsoft Office Picture Manager і просто вставити знімок екрана в потрібну білу область каталогу. Це створить растрову карту, яку ви можете редагувати або зберігати як інший формат.


Хоча це може спрацювати, запитувач, ймовірно, запитує спосіб зробити це програмно.
Петро О.

1

Завдяки TheSoftwareJedi за надану корисну інформацію про інструмент для оснащення в Windows 7. Ярлик для відкриття інструменту Snipping: Перейдіть до пункту «Пуск», введіть sni та ви знайдете ім’я у списку «Інструмент знімання»

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



0

Наскільки я знаю в XP, так, ви повинні використовувати якийсь інший додаток, щоб фактично зберегти його.

Vista поставляється з інструментом Snipping, який трохи спрощує процес!


0

Виявляється, Google Picasa (безкоштовно) зробить це зараз для вас. Якщо ви відкриєте його, при натисканні на нього збережеться знімок екрана у файл та завантажується у Picasa. На мій досвід, це чудово працює!



-6

Чи можливо це:

  1. Натисніть Alt PrintScreen
  2. Відкрийте папку
  3. Клацніть правою кнопкою миші -> скріншот екрана

Приклад:

Відкриється вікно результатів тестування, зробіть знімок екрана. Відкрийте C: \ Орієнтири Клацніть правою кнопкою миші -> Скріншот екрана З'явиться файл з назвою screenshot00x.jpg, вибраний текст скріншот00x. Введіть оверклок5

Це воно. Не потрібно нічого відкривати. Якщо ви нічого не пишете, ім'я за замовчуванням залишається.


у якій версії Windows є меню "Вставити скріншот"? (а з вмістом буфера обміну зображення типу немає пасти, активованої у win7).
eckes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.