Windows XPでは、Alt-PrintScreenを押してアクティブウィンドウの画像をコピーするか、Ctrl-PrintScreenを押してデスクトップ全体の画像をコピーできます。
これは、画像を受け入れるアプリケーション(Photoshop、Microsoft Wordなど)に貼り付けることができます。
不思議なんだけど: スクリーンショットを直接ファイルに保存する方法はありますか? しますか 本当に Paint.netやPhotoshopなどの画像プログラムを開いて、単に画像を貼り付けてから保存する必要がありますか?
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(およびその他のキー)をフックするコードは次のとおりです。
Windows 8より前では、サードパーティのツールを使用せずにファイルに直接保存する方法はありません。個人的にお気に入りのサードパーティ以外のツールソリューションを次に示します。
+ PrintScreen スクリーンショットを<user>/Pictures/Screenshots
のフォルダーに保存します
Win 7では、スニッピングツールを使用するだけです。最も簡単にアクセスするには、[スタート]ボタンを押してから、「sni」と入力します(Enter)。または それから snienter
次のキーボードの組み合わせを使用してキャプチャし、mspaintを使用して保存します。数回実行すると、2〜3秒しかかかりません。
さらに、 Cropper は素晴らしい(そしてオープンソース)。ファイルまたはクリップボードへの長方形キャプチャを行い、もちろん無料です。
ほとんど知られていない事実:ほとんどの標準的なWindows(XP)ダイアログでは、Ctrl + Cを押してダイアログの内容のテキストコピーを取得できます。
例:メモ帳でファイルを開く、スペースを押す、ウィンドウを閉じる、[終了の確認]ダイアログでCtrl + Cを押す、キャンセル、ダイアログのテキストをメモ帳に貼り付ける。
直接の質問とは関係ありませんが、このスレッドで言及するのはいいことですが。
実際、スクリーンショットを撮るにはサードパーティのソフトウェアが必要ですが、そのために大きなPhotoshopを起動する必要はありません。 IrfanWiewやXnViewのような無料で軽量なものが仕事をすることができます。 MWSnapを使用して、画面の任意の部分をコピーします。スクリーンショットを行うためにGDI +関数を呼び出す小さなAutoHotkeyスクリプトを作成しました。等。
すべてのソースコードとコメントをありがとう-それのおかげで、私は最終的に私が欲しかったアプリを持っています:)
いくつかの例をコンパイルしましたが、ソースと実行可能ファイルの両方がここにあります。
http://sdaaubckp.svn.sourceforge.net/viewvc/sdaaubckp/xp-take-screenshot/
InterceptCaptureScreen.exeを使用します。コマンドプロンプトターミナルで実行し、スクリーンショット(タイムスタンプされたファイル名、png、実行可能ファイルと同じディレクトリ内)をキャプチャする場合は、Insertを押します。端末がフォーカスされていない場合でもキーがキャプチャされます。
(Insertキーを使用します。これは、たとえばPrintScreenよりもVNCを介して伝播する方が簡単だからです。ラップトップではFnキーも押す必要があり、VNCを介して伝播することはありません。ソースコードで使用される実際のキーです)。
これがお役に立てば幸いです!
私が知っている非常に古い記事ですが、Windowsはついにプロセスがいかに奇妙であるかを認識しました。
Windows 8.1(検証済み、Windows 7(tnx @bobobobo)では動作しません)
windows key
+ prnt screen
はスクリーンショットを<user>/Pictures/Screenshots
のフォルダーに保存します
WinSnapをお勧めします http://www.ntwind.com/software/winsnap/download-free-version.html 。自動保存オプションを提供し、alt、printscreenおよびその他のキーの組み合わせをキャプチャして、画面、ウィンドウ、ダイアログなどをキャプチャします。
Dropboxは、これを自動的に行うフックを提供します。無料のDropboxアカウントを取得してラップトップアプリをインストールすると、PrtScrを押すとDropboxがすべてのスクリーンショットをDropboxフォルダーに自動的に保存するオプションを提供します。
これを試してください: http://www.screenshot-utility.com/
ホームページから:
ホットキーを押すと、画面のスナップショットがキャプチャされ、JPG、GIF、またはBMPファイルに保存されます。
これは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;
XPでその機能を使用するには、サードパーティのスクリーングラブユーティリティが必要です。 Scott Hanselmanの広範な クールなツールに関するブログ を掘り、通常はそのようなユーティリティを探します-確かに、彼はカップルについてブログを書いています こちら 。
Snagit ...多くの技術者がそれを使用しています。
Picasaをバックグラウンドで実行したまま、[画面の印刷]キーをクリックするだけです
スクリーンショットの自動保存ユーティリティをインストールせずに、できます。ただし、これを行うと、いくつかのユーティリティを見つけることができます。
私が推奨するスクリーンキャプチャプログラムをインストールする前に、これを行う最良の方法は、標準のPrint Screenメソッドを使用し、Microsoft Office Picture Managerを開いて、希望するディレクトリの白い領域にスクリーンショットを貼り付けることです。別の形式として編集または保存できるビットマップが作成されます。
もちろん、クリップボードを監視し、クリップボード内のすべての画像について迷惑なSaveAs-dialogを表示するプログラムを作成できます;-)。最後に押されたキーが誤検知の数を制限するためのPrintScreenであったかどうかを見つけることさえできると思います。
私はそれについて考えている間に..あなたはすでにそれをすでにやった人のためにグーグルをすることもできます。
EDIT:..または誰かがここにソースを投稿するのを待つ-たまたま:-)
Windows 7のスナップツールに関する有用な情報を提供してくれたTheSoftwareJediに感謝します。Snippingtoolを開くショートカット:スタートに移動し、sniと入力します。リストに名前が表示されます。
次のようなものが必要な場合があります。 http://addons.mozilla.org/en-US/firefox/addon/5648
IEのバージョンとExplorer Integrationのバージョンがあると思います。かなり良いソフトウェア。
これで、Google Picasa(無料)がこれを自動的に行うことがわかりました。開いている場合、クリックするとスクリーンショットがファイルに保存され、Picasaに読み込まれます。私の経験では、うまくいきます!
XPで知っている限り、実際に保存するには他のアプリを使用する必要があります。
VistaにはSnippingツールが付属しているため、プロセスが少し簡単になります。