pythonで簡単なスクリーンショットツールを作る|14にゴー14にゴーあなたは僅かな希望を抱いてここにやってきた。windowsスクリーンショットを撮りたい。pythonで作りたい。最終的に以下のような動きをするコードができる。大雑把にはこんな環境python3.5Windows10pillow、keybaord、mouseというライブラリを使うよ!とりあえずスクリーンショットを撮ってみるまずは画面全体の画像を取得してみる。ライブラリはPillowを使う。ImageGrab.grab()grabed_image.save('ss.jpg')実行すると画面全体のスクリーンショットがss.jpgという名前で保存される。特定のウィンドウだけを撮る画面全体ではなく、特定のウィンドウのスクリーンショットを保存したい。ウィンドウの領域を取得して、全体からその領域を切り取るという方向でよさそう。画像の切り抜きはImageオブジェクトにcropという関数がある。領域の取得はwindowsのAPIを使う。pywin32が手軽。pywin32FindWindowの2つめの引数にタイトルバーに表示される文字列を指定するとそのウィンドウのハンドルが返る。GetWindowRectにハンドルを渡すとそのウィンドウのサイズがタプルで返ってくる。bottomの順で格納されている。Elonaのssを撮ってみる。grabed_image.crop(rect)croped_image.save('saved.jpg')Elonaにしか使えない上にsleepで止めてgrabが発動する前にウィンドウを前に持ってくる操作技術が要求される使いづらいssツールができた。環境によってはうまくいくこともあるが、今回は領域が惜しい。Windows7以降のWindowsではエアロを有効にしているとGetWindowRectはウィンドウの影を含んだ領域を取得する。*このスクリプトを初めて起動するとき、若干時間がかかることがある。影の部分を取り除いたスクリーンショットを撮る正しい領域を取得するにはDwmGetWindowAttributeを使う。いうことでどうかよろしくおねがいします。pywin32に見当たらなかったのでctypesを使う。RECT構造体として受け取るのでタプルに直してからcropする。grabed_image.crop(rect)croped_image.save('saved2.jpg')ボーダーやタイトルバーを取り除きたいなどの理由がなければこれが期待するスクリーンショット。最初にクリックしたウィンドウのssを特定のキーを押した時に撮るもう少し使いやすいものにしたい。バックグラウンドで動いていて、特定のキーを押すと動く。いうのがほしいこれはフックの出番だ。いうときにkeyboardとmouseという便利なライブラリがある。mousekeyboardのサンプル。mouseも似たようなコードで動く。私の環境だとsuppressあたりの動きが少々怪しかったがssツールを作る分には問題ない。kとjを押すとabcやdefが出力される。suppress=True)keyboard.wait('esc')特定のキーを押したらスクリーンショットを撮るという処理はなんとかなりそう。あとは撮りたいウィンドウのハンドルをどうするかである。WindowsのAPIにはGetForegroundWindowという最前面のウィンドウのハンドルを取る関数がある。マウスでクリックして、その時の最前面のウィンドウを取得。クリックするとき、どうしてもタスクバーをクリックしてしまうのでタイトルが無かったらもう一度待ち受けるという処理も必要。あとmouseのwaitのtargettypeをupのみにしないとonclickが発動せずにwaitが終わる。suppress=False)print('escキーで終了')keyboard.wait('esc')printscreenキーでssが撮れるようになった。ついでにファイル名にタイムスタンプを付与。マウスを使って撮りたいウィンドウを取得する処理がちょっとぎこちない気がするがこまけぇことは(略。