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

Я помещаю превосходный ответ JLBorges на аналогичный вопрос дословно из cplusplus.com, так как это наиболее краткое объяснение, которое я прочитал по этому вопросу.

] В шаблоне, который мы пишем, есть два типа имен, которые можно использовать - зависимые имена и не зависимые имена. Зависимое имя - это имя, которое зависит от параметра шаблона; неизменяемое имя имеет то же значение, независимо от параметров шаблона.

Например:

template< typename T > void foo( T& x, std::string str, int count )
{
    // these names are looked up during the second phase
    // when foo is instantiated and the type T is known
    x.size(); // dependant name (non-type)
    T::instance_count ; // dependant name (non-type)
    typename T::iterator i ; // dependant name (type)

    // during the first phase, 
    // T::instance_count is treated as a non-type (this is the default)
    // the typename keyword specifies that T::iterator is to be treated as a type.

    // these names are looked up during the first phase
    std::string::size_type s ; // non-dependant name (type)
    std::string::npos ; // non-dependant name (non-type)
    str.empty() ; // non-dependant name (non-type)
    count ; // non-dependant name (non-type)
}

То, что зависит от зависимого имени, может быть чем-то другим для каждого конкретного экземпляра шаблона. Как следствие, шаблоны C ++ подвержены «двухфазному поиску имен». Когда шаблон сначала анализируется (до того, как выполняется какое-либо создание), компилятор просматривает не зависящие имена. Когда происходит конкретное создание шаблона, параметры шаблона известны к тому времени, и компилятор ищет зависимые имена.

На первом этапе анализатор должен знать, является ли зависимое имя именем типа или имени не-типа. По умолчанию зависимым именем считается имя не-типа.

Использовать ключевое слово typename только в объявлениях шаблонов и определениях, приведенных ниже.

blockquote>

у вас есть квалифицированное имя, которое относится к типу и зависит от параметра шаблона.

112
задан David Koelle 15 August 2017 в 16:41
поделиться

13 ответов

Можно кодировать что-то довольно простое, которое сцепит PrintScreen и сохранит получение в файле.

Вот что-то, чтобы начать получать и сохранять в файл. Необходимо будет просто сцепить ключевой "Экран Print".

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#:

код Hook

50
ответ дан u8it 24 November 2019 в 02:48
поделиться

Можно хотеть что-то вроде этого: http://addons.mozilla.org/en-US/firefox/addon/5648

, я думаю, существует версия для IE и также с Интеграцией Проводника. Довольно хорошее программное обеспечение.

0
ответ дан Nakilon 24 November 2019 в 02:48
поделиться

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

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

0
ответ дан Mitchel Sellers 24 November 2019 в 02:48
поделиться

Snagit... большое техническое народное использование это.

1
ответ дан pearcewg 24 November 2019 в 02:48
поделиться

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

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

<час>

РЕДАКТИРОВАНИЕ :.. или просто ожидайте кого-то для регистрации источника здесь - как это просто произошло:-)

1
ответ дан VVS 24 November 2019 в 02:48
поделиться

Не устанавливая снимок экрана сохраняют утилиту автоматически, да Вы делаете. Существует несколько утилит, можно найти однако folr выполнение этого.

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

1
ответ дан mattlant 24 November 2019 в 02:48
поделиться

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

От их домашней страницы:

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

2
ответ дан JosephStyons 24 November 2019 в 02:48
поделиться

Это сделает это в Дельфи. Отметьте использование функции BitBlt, которая является Windows API call, не чем-то характерным для Дельфи.

Редактирование: Добавленное использование в качестве примера

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
ответ дан JosephStyons 24 November 2019 в 02:48
поделиться

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

2
ответ дан Peter Meyer 24 November 2019 в 02:48
поделиться

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

6
ответ дан Jason 24 November 2019 в 02:48
поделиться

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

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

17
ответ дан PhiLho 24 November 2019 в 02:48
поделиться

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

Для Windows 8 и позже

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

Для победы Windows 7

In 7, просто используют инструмент отрезания: наиболее легко полученный доступ через нажатие Start, затем вводя "sni" (входят). или Windows Key тогда s n , я ввожу предыдущие версии

Windows

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

  1. Высокий звук + PrintScreen
  2. Win + R ("работает")
  3. , тип "mspaint" вводит
  4. Ctrl - V (вставка)
  5. Ctrl - S (сохраняют)
  6. диалоговое окно файла использования
  7. Высокий звук - F4 (закройте mspaint)

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

150
ответ дан farukdgn 24 November 2019 в 02:48
поделиться

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

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

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

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

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

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

15
ответ дан 24 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: