目次

はじめに

Windowsに標準で搭載されているスクリーンショットは、クリップボードに記録されるだけで、画像ファイルとして自動保存されることはない。
それはそれで便利なこともあるのだが、わざわざペイントソフトを開いて保存するのも煩わしい。

そこで、以下のアプリを利用して自動的にスクリーンショットを保存するように設定する。
  1. AutoHotKey(導入方法
  2. NirCmd(導入方法

設定の前に

Windowsでは、Fn + PrintScreen(PrtScr)またはPrtScr単体で全画面のスクショを撮れることが多い。
さらに、Altキーを組み合わせるとアクティブウィンドウのみを撮影できる。

なので、基本的にはPtrScrやAltを修飾キーとしてAutoHotKeyで置き換えていく。
(ちなみにFnキーの置換はAHKでもChangeKeyでも出来ないようだ。)

スクリーンショットの自動保存スクリプト

以下は実際のスクリプトの例である。

変数「ssname」にファイル名を代入し、連番で重複しないように保存していく。
以下では保存先が「%A_Desktop%」、つまりユーザーのデスクトップになっている。
以下の設定では、PrtScrの元々の機能は抑制されるので、同時にクリップボードへ保存されることはない。
;------------------------------------
; 全画面スクショ保存
;------------------------------------
PrintScreen::
		; 最初に連番をリセットする。0の個数は以下で指定する最低桁数に合わせる。
		; 連番をリセットすると、削除されたスクショファイルを埋めるようにファイル名が振られる。
		; リセットせずに番号を振り続ける場合はコメントアウトする。
		ssname := 000
	Loop
	{
		; 連番の桁数を設定する。
		; 「0X」:最低X桁で表示し、空いた位は0で埋める。
		SetFormat, FloatFast, 03
		ssname += 0.0
		; 保存場所に既存のデータがないか確認。保存場所、ファイル名と一致させること。
		IfExist, %A_Desktop%\%ssname%.png
		{
			; 既存データがある場合は変数に加算して、次のファイルを確認する。
			ssname ++
		}
		Else
		{
			; 既存データがない場合はスクショを保存する。
			; 保存場所とファイル名を"で括って指定する。
			RunWait, nircmdc.exe savescreenshot "%A_Desktop%\%ssname%.png", ,Hide
			break
		}
	}
	Return

;------------------------------------
; Alt + PrtScr
; アクティブウィンドウのスクショ保存
;------------------------------------
!PrintScreen::
		; ssname := 000の代わりに以下のように設定しても良い。
		SetFormat, FloatFast, 03
		ssname := 0
	Loop
	{
		SetFormat, FloatFast, 03
		ssname += 0.0
		IfExist, %A_Desktop%\%ssname%.png
		{
			ssname ++
		}
		Else
		{	
			RunWait, nircmdc.exe savescreenshotwin "%A_Desktop%\%ssname%.png", ,Hide
			break
		}
	}
	Return


Windows標準のクリップボードへのコピー機能を残す方法

スクショを画像として保存するだけでなく、クリップボードに保存してから任意のペイントソフトに貼り付けたい場合もあるかもしれない。そのような場合はWinの元々の機能を維持したままホットキーを割り当てる。

単純な話で、修飾するキーを変えるだけで良い。
各PCの環境に応じて好きなキーを指定すれば良いが、変換キーなどはテキストエディタなどで使い難いので注意する。なお、変換キーなどを修飾キーにする方法はこちら(準備中)。
また、一部のウィンドウでは使えない修飾キー(シフトキーなど)もあるようなので、適宜変更するべし。
;------------------------------------
; Ctrl + PrtScr
; 全画面スクショ保存
;------------------------------------
^PrintScreen::
		ssname := 000
	Loop
	{
		SetFormat, FloatFast, 03
		ssname += 0.0
		IfExist, %A_Desktop%\%ssname%.png
		{
			ssname ++
		}
		Else
		{
			RunWait, nircmdc.exe savescreenshot "%A_Desktop%\%ssname%.png", ,Hide
			break
		}
	}
	Return

;------------------------------------
; Ctrl + Alt + PrtScr
; アクティブウィンドウのスクショ保存
;------------------------------------
^!PrintScreen::
		ssname := 000
	Loop
	{
		SetFormat, FloatFast, 03
		ssname += 0.0
		IfExist, %A_Desktop%\%ssname%.png
		{
			;
			ssname ++
		}
		Else
		{	
			RunWait, nircmdc.exe savescreenshotwin "%A_Desktop%\%ssname%.png", ,Hide
			break
		}
	}
	Return 

アクティブウィンドウのスクショがずれる場合の対処法

私の環境では、アクティブウィンドウのスクショが縦横の両方向に1ピクセルずつ余分に切り取られてしまう。
その対処法として、ウィンドウの位置とサイズを指定してスクショを撮る。

「WinGetPos」でウィンドウの位置と場所を変数に格納。
指定するウィンドウは「A」、つまりアクティブウィンドウとする。
あとはNirCmdの座標を指定したスクショ保存を活用するだけである。
;------------------------------------
; Ctrl + Alt + PrtScr
; アクティブウィンドウのスクショ保存(改良版)
;------------------------------------
^!PrintScreen::
		SetFormat, FloatFast, 03
		ssname := 0
	Loop
	{
		SetFormat, FloatFast, 03
		ssname += 0.0
		IfExist, %A_Desktop%\%ssname%.png
		{
			ssname ++
		}
		Else
		{
			; WinGetPosでx座標、y座標、幅、高さを取得する。
			WinGetPos, ssx, ssy, ssw, ssh, A
			RunWait, nircmdc.exe savescreenshot "%A_Desktop%\%ssname%.png" %ssx% %ssy% %ssw% %ssh%, ,Hide
			break
		}
	}
	Return

保存するファイル名を日付にする

ファイル名を連番ではなく、日付にしたい場合は以下のようなスクリプトになる。
実際のファイル名はYYYYMMDDhhmmss.png(例えば20160101123456.png)のように年月日時分秒となる。

ファイル名が重複することは稀だろうが、以下ではメッセージが出るようになっている。
連番のファイル名を付けるスクリプトを応用すれば、重複時に(2)や(3)のように番号を振ることもできるが、今回は割愛する。

その他、ファイル名に使える変数などはこちら(AutoHotKey Wiki)
;------------------------------------
; スクショ保存
;------------------------------------
^PrintScreen::
	IfExist, %A_Desktop%\%A_Now%.png
		{
			MsgBox, The file has already exsited.
		}
	Else
		{
			RunWait, nircmdc.exe savescreenshot "%A_Desktop%\%A_Now%.png", ,Hide
		}
	Return

以上でスクリーンショットの自動保存化は完了。