117

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


TheSoftwareJedi は、Windows 8 および 10 について上記の質問に正確に回答しました。

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

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

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

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

4

20 に答える 20

155

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

Windows 8 以降の場合

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

Windows 7 の場合

win 7 では、スニッピング ツールを使用するだけです。最も簡単にアクセスするには、[スタート] を押してから「sni」(Enter) と入力します。または 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は優れています (そしてオープン ソース)。ファイルまたはクリップボードへの四角形のキャプチャを行い、もちろん無料です。

于 2008-10-01T15:41:52.357 に答える
50

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 (およびその他のキー) をフックするコードは次のとおりです。

フックコード

于 2008-10-01T15:21:28.973 に答える
17

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

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

于 2008-10-01T15:59:26.917 に答える
15

すべてのソース コードとコメントに感謝します - そのおかげで、私はついに私が欲しかったアプリを手に入れました :)

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

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

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

(Insertキーを使用します。たとえば、PrintScreenよりもVNCを介して伝播する方が簡単なはずです-私のラップトップではFnキーも押す必要があり、VNCを介して伝播しません。もちろん、何を簡単に変更できますソースコードで使用される実際のキーです)。

これが役に立てば幸いです、乾杯!

于 2010-04-29T08:02:16.930 に答える
12

非常に古い投稿だと思いますが、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

于 2013-12-30T13:28:02.850 に答える
6

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

于 2008-10-10T04:46:26.950 に答える
4

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

于 2014-02-17T15:58:19.140 に答える
2

XP でその機能を使用するには、サードパーティの画面グラブ ユーティリティが必要です。私は Scott Hanselman のクールなツールに関する広範囲にわたるブログを掘り下げ、通常はそのようなユーティリティを探します

于 2008-10-01T15:24:08.873 に答える
2

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

彼らのホームページから:

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

于 2008-10-01T17:27:41.463 に答える
2

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

編集:使用例を追加

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;
于 2008-10-01T16:12:25.203 に答える
1

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

于 2011-06-03T13:48:57.177 に答える
1

もちろん、クリップボードを監視し、クリップボード内のすべての画像に対して煩わしい名前を付けて保存ダイアログを表示するプログラムを作成することもできます ;-)。最後に押されたキーが PrintScreen であったかどうかを調べて、誤検出の数を制限することもできると思います。

私がそれについて考えている間.. まさにそれをすでに行っている人をグーグルで検索することもできます.


編集:..または、誰かがここにソースを投稿するのを待つだけです-たまたま:-)

于 2008-10-01T15:22:15.417 に答える
1

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

ここに画像の説明を入力

于 2014-04-22T03:40:57.947 に答える
1

Picasa をバックグラウンドで実行したままにして、[Print Screen] キーをクリックするだけです

ソース

于 2015-05-30T06:25:43.403 に答える
1

スクリーンショットの自動保存ユーティリティをインストールしなくても、そうです。ただし、これを行うためのユーティリティがいくつかあります。

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

于 2008-10-01T15:20:16.153 に答える
1

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

于 2008-10-01T15:37:06.923 に答える
0

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

于 2012-12-05T22:17:16.640 に答える
0

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

IE用のバージョンと、エクスプローラー統合のバージョンがあると思います。かなり良いソフトウェア。

于 2008-10-01T15:40:05.810 に答える
0

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

Vista には Snipping ツールが付属しており、プロセスが少し簡素化されます。

于 2008-10-01T15:17:49.640 に答える
-6

これは可能ですか:

  1. Alt PrintScreen を押す
  2. フォルダを開く
  3. 右クリック -> スクリーンショットを貼り付け

例:

ベンチマーク結果ウィンドウが開いています。スクリーンショットを撮ります。C:\Benchmarks を開きます。右クリック -> スクリーンショットを貼り付けます。screenshot00x.jpg という名前のファイルが表示され、テキストが選択されています。タイプオーバークロック5

それでおしまい。何も開く必要はありません。何も書かなければデフォルト名のままです。

于 2011-10-09T18:29:06.917 に答える