ウィンドウ・キャプチャ

Capture-Window.ps1

ウィンドウ・キャプチャ

Capture-Window.ps1

# $OutputDir
#     出力先のフォルダ・パス
Param( [System.IO.DirectoryInfo] $OutputDir )

$src = '
using System;
using System.Runtime.InteropServices;
public static class W32
{
    [DllImport(@"User32.dll")]
    public extern static IntPtr GetForegroundWindow();

    [DllImport(@"Dwmapi.dll")]
    public extern static int DwmGetWindowAttribute( IntPtr hWnd, uint nAttributes, ref RECT rcWindow, int nAttributesSize );

    const uint DWMWA_EXTENDED_FRAME_BOUNDS = 9;

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;        // x position of upper-left corner
        public int Top;         // y position of upper-left corner
        public int Right;       // x position of lower-right corner
        public int Bottom;      // y position of lower-right corner
    }

    public static RECT GetRect()
    {
        IntPtr hWnd = GetForegroundWindow();
        
        RECT rcWindow = new RECT();

        DwmGetWindowAttribute(
            hWnd,
            DWMWA_EXTENDED_FRAME_BOUNDS,
            ref rcWindow,
            Marshal.SizeOf(rcWindow) );

        return rcWindow;
    }
}
'

    Add-Type -AssemblyName System.Drawing

    trap
    {
        break
    }


    try
    {
        Add-Type $src

        Write-Host "型を追加しました"
    }
    catch
    {
        Write-Host "型は既に追加済みです"

        return
    }


    $images = Get-ChildItem $OutputDir.FullName -Filter:'*.png'

    $nIndex = 0

    if( $images -ne $Null )
    {
        $nIndex = $images | &{ Process{++ $nIndex} End{$nIndex} }
    }


    [System.Threading.Thread]::Sleep( 1000 )


    $rc = [W32]::GetRect()


    $dt = (Get-Date).ToString( 'yyyy-MM-dd HH:mm:ss' )


    $canvasSize = [System.Drawing.Size]::new( $rc.Right - $rc.Left, $rc.Bottom - $rc.Top )

    $titleSize = [System.Drawing.Size]::new( 140, 16 )


    $ft = [System.Drawing.Font]::new( 'MS ゴシック', 10 )


    $bmp = [System.Drawing.Bitmap]::new( $rc.Right - $rc.Left, $rc.Bottom - $rc.Top )


    [System.Drawing.Graphics] $g = [System.Drawing.Graphics]::FromImage( $bmp )


    $g.CopyFromScreen( $rc.Left, $rc.Top, 0, 0, $canvasSize )

    $xPos = $canvasSize.Width  - $titleSize.Width
    $yPos = $canvasSize.Height - $titleSize.Height

    $g.FillRectangle( [System.Drawing.Brushes]::White, $xPos, $yPos, $titleSize.Width, $titleSize.Height )

    $g.DrawString( $dt, $ft, [System.Drawing.Brushes]::Black, $xPos + 4, $yPos + 2 )


    do
    {
        $nIndex ++

        $path = '{0}\{1:D5}.png' -f $OutputDir.FullName, $nIndex

        if( [System.IO.File]::Exists($path) -eq $False )
        {
            $bmp.Save( $path, [System.Drawing.Imaging.ImageFormat]::Png )

            break
        }
    }while( $True )


    $bmp.Dispose()

    $g.Dispose()

capture.js

// JScript (WSH) から .PS1 を実行する
// JScript から実行することで PowerShell のウィンドウを含めないようにキャプチャする
//
// この .JS を実行してから 1 秒後にキャプチャする

var sh = new ActiveXObject( "WScript.Shell" );

// 実行するコマンドレットのパス
var sCmdLet = "Capture-Window.ps1";

// キャプチャ画像を保存するフォルダのパス
var sOutputDir = "D:\\tmp\\o";

sh.Run( "PowerShell -ExecutionPolicy RemoteSigned -File \"" + sCmdLet + "\" \"" + sOutputDir + "\"", 0 );