SS_window.py 技術ドキュメント

プログラムの動作

SS_window.py は、実行中のコンピュータのウィンドウ一覧を表示し、ユーザーが選択した特定のウィンドウをアクティブにしてスクリーンショットを撮影するPythonスクリプトです。このプログラムはOSに依存するウィンドウ操作やスクリーンショット機能を、Windows、macOS、Linuxといった複数のプラットフォームに対応するように設計されています。

主な機能は以下の通りです。

  • OS判別: 実行されているオペレーティングシステムを自動的に判別します。

  • ウィンドウリストの取得: OSに応じた適切なシステムコマンドやライブラリを利用して、現在開いているウィンドウ(またはアプリケーション)のタイトル一覧を取得し、番号付きリストで表示します。

  • ウィンドウのアクティブ化: ユーザーが選択したウィンドウを最前面に表示し、アクティブな状態にします。

  • スクリーンショットの撮影と保存: アクティブにしたウィンドウ(または画面全体)のスクリーンショットを撮影し、タイムスタンプを含むファイル名 (ss_{timestamp}.png) でPNG画像として保存します。

このプログラムは、特定の作業ウィンドウを頻繁にキャプチャする必要があるユーザーや、クロスプラットフォームで動作するシンプルなスクリーンショットツールを求めるユーザーにとって有用です。

原理

このプログラムは、特定の数式や物理式は使用せず、主にオペレーティングシステム固有の機能を利用してウィンドウ情報取得と操作、およびスクリーンショット撮影を行います。中心となるアルゴリズムは以下の通りです。

  1. OSの識別: platform.system() 関数を用いて、実行環境がWindows、Darwin (macOS)、またはLinuxのいずれであるかを判別します。これにより、OSごとに異なるAPIやコマンドを適切に呼び出すことが可能になります。

  2. ウィンドウリストの取得:

    • Windows: pygetwindow ライブラリの gw.getAllWindows() を使用して、すべての開いているウィンドウオブジェクトを取得し、それぞれの title プロパティからウィンドウタイトルを抽出します。

    • macOS: osascript コマンドラインツールを利用してAppleScriptを実行します。具体的には、tell application "System Events" to get name of every process whose background only is false というスクリプトを実行し、フォアグラウンドで動作しているアプリケーションの名前一覧を取得します。

    • Linux: wmctrl -l コマンドを実行します。このコマンドは現在開いているすべてのウィンドウのリスト(ID、デスクトップ番号、ホスト名、ウィンドウタイトル)を出力するため、その出力からウィンドウタイトル部分をパースして取得します。

  3. ウィンドウのアクティブ化と領域特定:

    • Windows: pygetwindow.getWindowsWithTitle(target_title)[0] で対象ウィンドウオブジェクトを取得し、win.activate() メソッドでアクティブ化します。その後、ウィンドウオブジェクトの left, top, width, height プロパティからスクリーンショットの対象領域を特定します。

    • macOS: osascript -e 'tell application "{target_title}" to activate' コマンドを実行し、指定されたアプリケーションをアクティブにします。macOSではプログラムから特定のウィンドウの正確な座標を取得することが複雑であるため、本プログラムでは便宜上、画面全体のスクリーンショットを撮影する挙動を取ります。

    • Linux: wmctrl -a target_title コマンドを実行して、指定されたタイトルのウィンドウをアクティブ化します。macOSと同様に、特定のウィンドウ領域をプログラムから正確に取得することが一般的な方法ではないため、画面全体のスクリーンショットを撮影する挙動を取ります。

  4. スクリーンショットの撮影: pyautogui.screenshot(region=region) 関数を使用します。

    • Windowsの場合、取得したウィンドウ領域 region=(left, top, width, height) を引数として渡すことで、その領域のみを撮影します。

    • macOSおよびLinuxの場合、region=None となるため、pyautogui はデフォルトで画面全体のスクリーンショットを撮影します。

  5. ファイル保存: 撮影された Image オブジェクトは、現在のUnixタイムスタンプをファイル名に含めた ss_{int(time.time())}.png という形式でPNGファイルとして保存されます。

必要な非標準ライブラリとインストール方法

SS_window.py を実行するためには、以下の非標準Pythonライブラリが必要です。

  • pyautogui: GUI自動化およびスクリーンショット撮影に使用されます。

  • Pillow (PIL): pyautogui が撮影した画像を保存するために内部的に使用します。

  • pygetwindow: (Windowsのみ) Windows環境でウィンドウの情報を取得し、操作するために使用されます。

これらのライブラリは pip コマンドでインストールできます。

pip install pyautogui pillow pygetwindow

また、OSによっては追加のシステムツールが必要になる場合があります。

  • Linux:

    • wmctrl: ウィンドウリストの取得とアクティブ化に使用されます。

    • scrot または gnome-screenshot: pyautogui がスクリーンショットを撮影するために必要となる場合があります。

    sudo apt-get install wmctrl scrot # または gnome-screenshot
    
  • macOS:

    • osascript: AppleScriptを実行するためにmacOSに標準で搭載されています。

    • pyautogui がスクリーンショットを撮影するために、macOSの「システム設定」->「プライバシーとセキュリティ」->「画面収録」でターミナルや使用しているIDEに許可を与える必要がある場合があります。

必要な入力ファイル

このプログラムは、実行時に特定の入力ファイルを必要としません。 プログラムの実行中に、開いているウィンドウのリストが表示され、ユーザーはコンソールを通じて操作対象のウィンドウの番号を入力するだけです。

生成される出力ファイル

プログラムは、実行が成功した場合に以下のファイルを生成します。

  • ファイル名: ss_{timestamp}.png

    • {timestamp} は、スクリーンショットが撮影されたUnixタイムスタンプ(秒)を表す整数です。

    • 例: ss_1678886400.png

  • 形式: PNG画像ファイル

  • 内容:

    • Windows環境では、ユーザーが選択したウィンドウのスクリーンショットが保存されます。

    • macOSおよびLinux環境では、画面全体のスクリーンショットが保存されます。

これらのファイルは、プログラムが実行されたディレクトリに保存されます。

コマンドラインでの使用例 (Usage)

SS_window.py を実行するには、Pythonインタープリタを使用してスクリプトを起動します。 特別なコマンドライン引数は必要ありません。

python SS_window.py

プログラムが起動すると、現在開いているウィンドウ(またはアプリケーション)のリストが番号付きで表示されます。ユーザーはそのリストからスクリーンショットを撮りたいウィンドウの番号を入力し、Enterキーを押します。

コマンドラインでの具体的な使用例

以下の例では、プログラムを実行し、表示されたウィンドウリストから「Terminal」を選択してスクリーンショットを撮影するシナリオを示します。(実際の出力はOSや開いているアプリケーションによって異なります。)

$ python SS_window.py

出力例:

[1] Mozilla Firefox
[2] Visual Studio Code
[3] Terminal
[4] Zoom Meeting
[5] Calculator

番号を選んでください: 3
保存成功: ss_1701234567.png

実行結果の説明:

  1. python SS_window.py コマンドを実行すると、まず現在開いているウィンドウのリストがコンソールに表示されます。

  2. この例では、「Terminal」がリストの3番目に表示されています。

  3. ユーザーが 3 を入力してEnterキーを押すと、プログラムは「Terminal」ウィンドウをアクティブにします。

  4. 次に、その「Terminal」ウィンドウ(Windowsの場合)または画面全体(macOS/Linuxの場合)のスクリーンショットを撮影します。

  5. スクリーンショットは ss_1701234567.png のような名前で、プログラムが実行されたディレクトリにPNGファイルとして保存されます。1701234567 の部分は、スクリーンショット撮影時の実際のUnixタイムスタンプに置き換わります。

  6. 最後に、「保存成功: ss_1701234567.png」というメッセージが表示され、プログラムは終了します。 (Linux環境で wmctrl がインストールされていない場合は「Linuxで実行するには 'sudo apt-get install wmctrl' が必要です。」というメッセージが表示されることがあります。)