1. ホーム
  2. windows

[解決済み] Windowsでスクリーンショットを直接ファイルに保存するにはどうすればよいですか?[クローズド]

2022-05-16 19:16:25

質問

Windows でスクリーンショットをファイルに直接保存するための 1 つのボタンによる方法はありますか?


TheSoftwareJedi は Windows 8 および 10 のために上記の質問に正確に答えました。 以下のオリジナルの余分な材料は、後世に残ります。

これは、2021年現在、316Kビューが示すように、非常に重要な質問です。 2008年に質問され、SOは2015年頃にこの質問をオフトピックであるとして閉じました。 おそらく以下の最後の質問のためです。

<ブロッククオート

Windows XP では、Alt-PrintScreen を押してアクティブなウィンドウの画像をコピーすることができます。 または Ctrl-PrintScreen を押して、デスクトップ全体の画像をコピーすることができます。 デスクトップ全体の画像をコピーできます。

これは、画像を受け入れるアプリケーションに貼り付けることができます。 Photoshop、Microsoft Word などです。

不思議に思うのですが スクリーンショットを直接ファイルに保存する方法はありますか。 ファイルに保存する方法はありますか? 私は 本当に のような画像プログラムを開かなければなりませんか? Paint.net や Photoshop のような画像プログラムを開いて画像を貼り付け、それを保存するだけでよいのでしょうか?

どのように解決するのですか?

PrintScreen をフックしてキャプチャをファイルに保存するような、非常に簡単なコードを書くことができます。

ここに、キャプチャしてファイルに保存するために開始する何かがあります。キー "Print screen" をフックする必要があるだけです。

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);
}

更新 C#からPrintScreen(と他のキー)をフックするコードは以下のとおりです。

フックコード