動機
- 一般的なアプリでChromeのスクショを撮ると、タイトルバーなどが入る。
- Fireshotなりの拡張で対応はできるが、そこからローカルに保存したりSNSに投稿したりが一手間かかったり有料だったりする
- めんどうくさいので、ホットキー一発でスクショして保存なり投稿なりできるようにしたい
AutoHotKeyで対応
では、どうやってWebページが表示されている部分のみをスクショするか。
AU3Spyで調査すると、この部分はChrome_RenderWidgetHostHWND1
というコントロール名が割り振られている。
よって、ControlGetPos
コマンドで、この部分の座標情報を取得することができる。
ただし、取得できるのはアクティブウィンドウ内での相対座標であるため、WinGetPos
でアクティブウィンドウの座標を取得し、計算してやる必要がある。
座標情報が取得できれば、座標を指定してスクショできるコマンドラインツール(例えばNirCmd)でスクショ自体は簡単にできる。
ss.ahk
PrintScreen::
ssDir = C:\Users\Public\Pictures\Capture
ssFile = %ssDir%\%A_Now%.jpg ; 日時からファイル名を生成
SetTitleMatchMode, RegEx ; ウィンドウタイトルを正規表現マッチ
If WinActive(" - Google Chrome$ ahk_exe chrome.exe") ; Chromeブラウザがアクティブの場合
{
WinGetPos, ssX, ssY, , A ; アクティブウィンドウの座標を取得
ControlGetPos, CX, CY, ssW, ssH, Chrome_RenderWidgetHostHWND1, A, , ; コントロールの相対座標および幅・高さを取得
ssX += %CX% ; コントロールのX座標計算
ssY += %CY% ; コントロールのY座標計算
RunWait, "C:\apps\nircmd-x64\nircmd.exe" savescreenshot %ssFile% %ssx% %ssy% %ssw% %ssh%, ,
}
Else ; Chrome以外の場合、アクティブウィンドウ全体をスクショ
{
RunWait, "C:\apps\nircmd-x64\nircmd.exe" savescreenshotwin %ssFile%, ,
}
Return
# IfWinActive
Chromeのアクティブ判定はいろんなやり方があるが、Chromium系アプリ(Visual Studio Codeとか)や(いちおうまだ現役の)Chromeアプリ等を排除するため、実行ファイル名およびウィンドウタイトルでの判定とした。
これで正常にスクショできた。