その他

簡単!PowerShellで作成できる画面録画ツールの紹介と作り方[No18]

スポンサーリンク

前回、フリーソフト「ScreenToGif」と「UiPath」を用いてRPAプログラムの動作を確認する方法を紹介しましたが、フリーソフトの利用を嫌がる方もいると思います。

私もその一人です。

動作が保証されず、使用するのは自己責任となる点や、PCにあまり多くのソフトをインストールしたくないという点に悩むこともありますよね。

できれば標準ソフトウェアでも同様に動作確認を実現させたいと思い、探してみましたが良いものは見つかりませんでした。

MicroSoftのPowerPointの画面録画機能を用いる方法もありますが、あまりおすすめはできません。理由は、数秒でもファイル容量が大きくなってしまうからです。圧縮すれば問題ないのではないかと思う人もいるかもしれませんが、それにも限界があるため、なるべく避けたいところです。

そこで今回は別の方法を考え、ツールを作成しましたので紹介したいと思います。

画面録画ツールについて

ソフトはWindowsに搭載されているPowerShellで作成します。PowerShellを使用するメリットは、コマンドプロンプトでは実現できなかった命令を組み合わせる機能、いわゆるパイプラインが備わっている点にあります。相対的に見て、より高度で細かく動作を制御することが可能なので、今回はPowerShellを使用することにしました。

ツールの作り方

1.デスクトップに次のファイルを用意する。

・ファイル「RunScreenRecorder.cmd」※ファイルの中身は下記コード。

・ファイル「ScreenRecorder.ps1」※ファイルの中身は下記コード。


start /min PowerShell -ExecutionPolicy RemoteSigned .\ScreenRecorder.ps1

#アセンブリ読み込み
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms

$flgFolderPath = ".\output"
$flgFileName = "startstopflg.txt"
$flgFilePath = ($flgFolderPath + "\" + $flgFileName)

$outputFolderPath01 = ".\output"
$nowDate = (Get-Date).ToString("yyyyMMdd_HHmm") 
$identificationName = "test"
$outputFolderPath02 = $nowDate + "_" + $identificationName

$outputFolderPath = ($outputFolderPath01 + "\" + $outputFolderPath02)

New-Item ($outputFolderPath) -ItemType Directory -Force

#各種設定
#■□■□
#何ミリ秒ごとに取得するか
$sleepTime = 250

#画面内取得範囲の始点(X座標・Y座標)
$screenShotStartPsx = 0
$screenShotStartPsy = 0

#画面内取得範囲の始点からの長さ
$screenShotWidth = 1920
$screenShotHeight = 1080

#背景の始点(X座標・Y座標)
$bgx = 1920
$bgy = 0
#背景の幅・高さ
$bgwidth = 500
$bgheight = 200
#背景の色(R)
$bgCol_R = 0
#背景の色(G)
$bgCol_G = 0
#背景の色(B)
$bgCol_B = 0

#文字のX座標・Y座標
$strx = 1920
$stry01 = 0
$stry02 = 50
$stry03 = 100
#文字の大きさ
$strSize = 32
#文字のフォント
$strFontName = "メイリオ"
#文字の色(R)
$strFontCol_R = 255
#文字の色(G)
$strFontCol_G = 255
#文字の色(B)
$strFontCol_B = 255

#マウスポインタ文字のX座標・Y座標
$strMousepointx = 100
$strMousepointy = 100
#マウスポインタ文字の大きさ
$strMousepointSize = 8
#マウスポインタ文字の大きさの半分
$strMousepointSize_half = 4

#マウスポインタ文字のフォント
$strMousePointFontName = "メイリオ"
#マウスポインタ文字の色(R)
$strMousePointFontCol_R = 255
#マウスポインタ文字の色(G)
$strMousePointFontCol_G = 0
#マウスポインタ文字の色(B)
$strMousePointFontCol_B = 0

#イメージ画像の幅・高さ
$imgWidth = $screenShotStartPsx + $screenShotWidth + $bgwidth
$imgHeight = $screenShotStartPsy + $screenShotHeight
#■□■□


$flg = [int]1
echo 1 > $flgFilePath

#flgFileの一行目が1であれば実行、0であれば停止
while($flg){

	#ミリ秒数停止
	Start-Sleep -Milliseconds $sleepTime

	#flgFileの一行目を読み込み、flgにInt32型で代入する
	$flg = (Get-Content $flgFilePath)[0] -as [string]
	$flg = [int]$flg

	#イメージ生成
	$bmp = New-Object System.Drawing.Bitmap($imgWidth, $imgHeight)
	$newImage = [System.Drawing.Graphics]::FromImage($bmp)
	$newImage.CopyFromScreen($screenShotStartPsx, $screenShotStartPsy, 0, 0, $bmp.Size)

	#マウスのX座標,Y座標
	$psx = [System.Windows.Forms.Cursor]::Position.X
	$psy = [System.Windows.Forms.Cursor]::Position.Y

	#日時取得、座標編集
	#■□■□
	$nowTime = (Get-Date)
	$nowTimeImageUse = $nowTime.ToString("yyyy/MM/dd/ HH:mm:ss") 
	$nowTimeFileName = $nowTime.ToString("yyyyMMdd_HHmmss") 
	$psx_filename = ("【x:" + $psx + "】")
	$psy_filename = ("【y:" + $psy + "】")

	#座標書き込み(参考元:https://logicalerror.seesaa.net/article/406790999.html)
	#■□■□
	#背景用
	$bg = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb($bgCol_R, $bgCol_G, $bgCol_B)) 
	#背景を塗りつぶし
	$newImage.FillRectangle($bg, $bgx, $bgy, $bgwidth, $bgheight)

	#文字用フォント作成
	$ff = New-Object System.Drawing.FontFamily -ArgumentList $strFontName
	$type = [System.Drawing.FontStyle]::Regular
	$strFont = New-Object System.Drawing.Font -ArgumentList $ff,$strSize,$type

	#文字用ブラシ作成
	$strCol = [System.Drawing.Color]::FromArgb($strFontCol_R,$strFontCol_G,$strFontCol_B)
	$strBrush = New-Object System.Drawing.SolidBrush -ArgumentList $strCol

	#マウスポインタ用フォント作成
	$ffMousePoint = New-Object System.Drawing.FontFamily -ArgumentList $strMousePointFontName
	$typeMousePoint = [System.Drawing.FontStyle]::Bold
	#$typeMousePoint = [System.Drawing.FontStyle]::Regular
	$strMousePointFont = New-Object System.Drawing.Font -ArgumentList $ffMousePoint,$strMousepointSize,$typeMousePoint

	#マウスポインタ用ブラシ作成
	$strMouseCol = [System.Drawing.Color]::FromArgb($strMousePointFontCol_R,$strMousePointFontCol_G,$strMousePointFontCol_B)
	$strMouseBrush = New-Object System.Drawing.SolidBrush -ArgumentList $strMouseCol

	#アンチエイリアス設定
	$newImage.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::AntiAliasGridFit

	#書き込み
	$newImage.DrawString( $nowTimeImageUse, $strFont, $strBrush, $strx, $stry01 )
	$newImage.DrawString( $psx_filename, $strFont, $strBrush, $strx, $stry02 )
	$newImage.DrawString( $psx_filename, $strFont, $strBrush, $strx, $stry03 )
	$newImage.DrawString( "〇", $strMousePointFont, $strMouseBrush, $psx-$strMousepointSize_half, $psy-$strMousepointSize_half )
	#■□■□

	#クリップボードへ保存
	[Windows.Forms.Clipboard]::SetImage(($bmp))

	#ファイル名編集
	$psx_psy_coordinate = ($psx_filename + $psy_filename)
	$outputFileName  = ($identificationName + "_" + $nowTimeFileName + $psx_psy_coordinate + ".png")

	#クリップボードに画像があれば保存
	$clipboardImage = [Windows.Forms.Clipboard]::GetImage()
	if ($clipboardImage -ne $null)
	{
		$outputFilePath =($outputFolderPath + "\" + $outputFileName)
		$clipboardImage.Save($outputFilePath)
	}
}

2.デスクトップにファルダ「output」を作成し中には次のファイルを用意する。

・ファイル「startstopflg.txt」※ファイルの中身は空っぽで大丈夫です。

・ファイル「startstopflg_stop_update.cmd」※ファイルの中身は下記コード。


echo 0 > .\startstopflg.txt

3.タスクスケジューラに次の2つのタスクを登録する。

・登録内容1:動作確認したいプログラムが開始する1分前に「RunScreenRecorder.cmd」を実行する。

・登録内容2:動作確認したいプログラムが終了する時に「startstopflg_stop_update.cmd」を実行する。

スポンサーリンク

ツールの様子

「RunScreenRecorder.cmd」が実行されると、フォルダ「output」にファイル「ScreenRecorder.ps1」で設定した内容で画像が生成されます。

詳細な内容

フォルダ「output」にフォルダ名「日時_識別名」のフォルダが作成され、その中に設定した周期でスクリーンショットが作成されていきます。

ファイル名は「識別名日時マウスの座標」です。

ツール作成上の工夫

スクリーンショット(クリップボードに保存した画像)にはマウスを表示させることができません。そのため、画像内に「マウスの座標」を表示し、マウスポインタ付近に「〇」を表示させています。

参考サイト

後日記載します。

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

-その他