web-dev-qa-db-ja.com

スクリーンショットをWindowsのファイルに直接保存するにはどうすればよいですか?

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

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

不思議なんだけど: スクリーンショットを直接ファイルに保存する方法はありますか? しますか 本当に Paint.netやPhotoshopなどの画像プログラムを開いて、単に画像を貼り付けてから保存する必要がありますか?

112
David Koelle

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

UpdateC#からPrintScreen(およびその他のキー)をフックするコードは次のとおりです。

フックコード

50

Windows 8より前では、サードパーティのツールを使用せずにファイルに直接保存する方法はありません。個人的にお気に入りのサードパーティ以外のツールソリューションを次に示します。

Windows 8以降の場合

Windows Key + PrintScreen スクリーンショットを<user>/Pictures/Screenshotsのフォルダーに保存します

Windows 7の場合

Win 7では、スニッピングツールを使用するだけです。最も簡単にアクセスするには、[スタート]ボタンを押してから、「sni」と入力します(Enter)。または Windows Key それから snienter

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 は素晴らしい(そしてオープンソース)。ファイルまたはクリップボードへの長方形キャプチャを行い、もちろん無料です。

149
TheSoftwareJedi

ほとんど知られていない事実:ほとんどの標準的なWindows(XP)ダイアログでは、Ctrl + Cを押してダイアログの内容のテキストコピーを取得できます。
例:メモ帳でファイルを開く、スペースを押す、ウィンドウを閉じる、[終了の確認]ダイアログでCtrl + Cを押す、キャンセル、ダイアログのテキストをメモ帳に貼り付ける。
直接の質問とは関係ありませんが、このスレッドで言及するのはいいことですが。

実際、スクリーンショットを撮るにはサードパーティのソフトウェアが必要ですが、そのために大きなPhotoshopを起動する必要はありません。 IrfanWiewやXnViewのような無料で軽量なものが仕事をすることができます。 MWSnapを使用して、画面の任意の部分をコピーします。スクリーンショットを行うためにGDI +関数を呼び出す小さなAutoHotkeyスクリプトを作成しました。等。

17
PhiLho

すべてのソースコードとコメントをありがとう-それのおかげで、私は最終的に私が欲しかったアプリを持っています:)

いくつかの例をコンパイルしましたが、ソースと実行可能ファイルの両方がここにあります。

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

InterceptCaptureScreen.exeを使用します。コマンドプロンプトターミナルで実行し、スクリーンショット(タイムスタンプされたファイル名、png、実行可能ファイルと同じディレクトリ内)をキャプチャする場合は、Insertを押します。端末がフォーカスされていない場合でもキーがキャプチャされます。

(Insertキーを使用します。これは、たとえばPrintScreenよりもVNCを介して伝播する方が簡単だからです。ラップトップではFnキーも押す必要があり、VNCを介して伝播することはありません。ソースコードで使用される実際のキーです)。

これがお役に立てば幸いです!

15
sdaau

私が知っている非常に古い記事ですが、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

11
Karthik T

WinSnapをお勧めします http://www.ntwind.com/software/winsnap/download-free-version.html 。自動保存オプションを提供し、alt、printscreenおよびその他のキーの組み合わせをキャプチャして、画面、ウィンドウ、ダイアログなどをキャプチャします。

6
Jason

Dropboxは、これを自動的に行うフックを提供します。無料のDropboxアカウントを取得してラップトップアプリをインストールすると、PrtScrを押すとDropboxがすべてのスクリーンショットをDropboxフォルダーに自動的に保存するオプションを提供します。

5
mwengler

これを試してください: http://www.screenshot-utility.com/

ホームページから:

ホットキーを押すと、画面のスナップショットがキャプチャされ、JPG、GIF、またはBMPファイルに保存されます。

2
JosephStyons

これはDelphiでそれを行います。 BitBlt関数の使用に注意してください。これは、Delphiに固有のものではなく、Windows API呼び出しです。

編集:使用例の追加

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

XPでその機能を使用するには、サードパーティのスクリーングラブユーティリティが必要です。 Scott Hanselmanの広範な クールなツールに関するブログ を掘り、通常はそのようなユーティリティを探します-確かに、彼はカップルについてブログを書いています こちら

2
Peter Meyer

Snagit ...多くの技術者がそれを使用しています。

1
pearcewg

Picasaをバックグラウンドで実行したまま、[画面の印刷]キーをクリックするだけです

ソース

1
Abilash A

スクリーンショットの自動保存ユーティリティをインストールせずに、できます。ただし、これを行うと、いくつかのユーティリティを見つけることができます。

例: http://www.screenshot-utility.com/

1
mattlant

私が推奨するスクリーンキャプチャプログラムをインストールする前に、これを行う最良の方法は、標準のPrint Screenメソッドを使用し、Microsoft Office Picture Managerを開いて、希望するディレクトリの白い領域にスクリーンショットを貼り付けることです。別の形式として編集または保存できるビットマップが作成されます。

1
Mike Kowalczyk

もちろん、クリップボードを監視し、クリップボード内のすべての画像について迷惑なSaveAs-dialogを表示するプログラムを作成できます;-)。最後に押されたキーが誤検知の数を制限するためのPrintScreenであったかどうかを見つけることさえできると思います。

私はそれについて考えている間に..あなたはすでにそれをすでにやった人のためにグーグルをすることもできます。


EDIT:..または誰かがここにソースを投稿するのを待つ-たまたま:-)

1
VVS

Windows 7のスナップツールに関する有用な情報を提供してくれたTheSoftwareJediに感謝します。Snippingtoolを開くショートカット:スタートに移動し、sniと入力します。リストに名前が表示されます。

enter image description here

1
Zahid Rouf

次のようなものが必要な場合があります。 http://addons.mozilla.org/en-US/firefox/addon/5648

IEのバージョンとExplorer Integrationのバージョンがあると思います。かなり良いソフトウェア。

0
apandit

これで、Google Picasa(無料)がこれを自動的に行うことがわかりました。開いている場合、クリックするとスクリーンショットがファイルに保存され、Picasaに読み込まれます。私の経験では、うまくいきます!

0
Zach

XPで知っている限り、実際に保存するには他のアプリを使用する必要があります。

VistaにはSnippingツールが付属しているため、プロセスが少し簡単になります。

0
Mitchel Sellers