自動作業記録ツールを作りたい

# Windowのハンドル名を取得して自分の行動の履歴をとりたかったのでPowerShellスクリプトで作成した。

もっと簡単にPythonなどなら記述できるがPythonが使えない現場も多かった為PowerShellで作成した。

内容は下記に記載

・日付変更後ウィンドウが変わるタイミングでファイルが日付付きで作成され、Startというログが時間つきで残る
・ウィンドウがアクティブ変更されるたびにログが追加される
・23時59分になるとEndというログが残る

以上を繰り返した。


```ruby:ps1
Add-Type @"
using System;
using System.Runtime.InteropServices;
using System.Text;

public class User32 {
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
    
    [DllImport("user32.dll", SetLastError = true)]
    public static extern int GetWindowTextLength(IntPtr hWnd);
}
"@

$logFileBasePath = "C:\Users\user\Desktop\logfile" # ログファイルの保存先
$previousWindowTitle = ""
$previousDate = Get-Date -Format "yyyy-MM-dd"
$startLogged = $false
$endLogged = $false

# 初回のログファイルのパス
$logFilePath = "$logFileBasePath-$previousDate.txt"

while ($true) {
    try {
        $currentDate = Get-Date -Format "yyyy-MM-dd"
        $currentTime = Get-Date -Format "HH:mm:ss"

        $hWnd = [User32]::GetForegroundWindow()
        if ($hWnd -ne [IntPtr]::Zero) {
            $titleLength = [User32]::GetWindowTextLength($hWnd)
            if ($titleLength -gt 0) {
                $windowTitle = New-Object System.Text.StringBuilder($titleLength + 1)
                $result = [User32]::GetWindowText($hWnd, $windowTitle, $windowTitle.Capacity)
                
                if ($result -eq 0) {
                    throw [System.Exception]::new("Failed to get window text.")
                }
                
                $currentWindowTitle = $windowTitle.ToString()

                # 全角スペースを削除
                $currentWindowTitle = $currentWindowTitle -replace '　', ''

                # 日付が変わっていて、新しいログファイルがまだ作成されていない場合
                if ($currentDate -ne $previousDate -and $currentWindowTitle -ne $previousWindowTitle) {
                    $logFilePath = "$logFileBasePath-$currentDate.txt"
                    $previousDate = $currentDate
                    $startLogged = $false
                    $endLogged = $false  # リセットして翌日に再びEnd_Dayを記録
                }

                # 初回のログ更新時にStart_Dayを記録
                if (-not $startLogged) {
                    $startEntry = "Start_Day [$currentTime]"
                    Add-Content -Path $logFilePath -Value $startEntry
                    $startLogged = $true
                }

                if ($currentWindowTitle -ne $previousWindowTitle) {
                    $dateTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                    $logEntry = "$dateTime - $currentWindowTitle"
                    Add-Content -Path $logFilePath -Value $logEntry
                    
                    $previousWindowTitle = $currentWindowTitle
                    Write-Host "$dateTime - $currentWindowTitle"
                }
            }
        } else {
            Write-Host "Failed to get foreground window handle."
        }

        # 23:59になったらEnd_Dayを記録
        if ($currentTime -eq "23:59:59" -and -not $endLogged) {
            $endEntry = "End_Day"
            Add-Content -Path $logFilePath -Value $endEntry
            $endLogged = $true
            Write-Host "$currentTime End_Day"
        }

    } catch {
        Write-Host "An error occurred: $_.Exception.Message"
    }
    Start-Sleep -Seconds 1
}
```

もしPowerShellじゃなくてコマンドプロンプトで開きたいという方はこれでコマンドプロンプトから起動できる

powershell -executionpolicy RemoteSigned -File "PowerShellのファイル名"

また起動時に真ん中に出したくないという方は、下記追加するといちいちウィンドウを移動しなくて済む

また
```mode 50,5```で大きさ等も変更できる