【Python】Windows10:アプリケーションを最前面に表示・アクティブ化させる方法

時計 2021.01.29 / 時計

【Python】Windows10:アプリケーションを最前面に表示・アクティブ化させる方法

本記事ではPythonプログラムにおける、Windows10でアプリケーションを最前面に表示・アクティブ化させる方法について解説していきます。

特定のアプリケーションを最前面表示・アクティブ化するのは、RPAプログラムを作成する際などで活躍します。
RPAで操作を自動化するには対象アプリをアクティブウィンドウにする必要がありますからね。

またライブラリにWindows APIを使用するPyWin32を本記事で紹介する方法では使っています。
使い方が若干難しいですが、Windowsのプログラム作成に非常に役に立つ関数が揃っております。

本記事を通して以下の知識を学べます。

学べる知識
  • アプリからウィンドウハンドルの取得方法
  • アプリを最前面に表示させる方法
  • アプリをアクティブにする方法

アプリケーションを最前面に表示させる方法

プログラムの流れ

Windows10のデスクトップアプリケーションを最前面に表示させるには以下の流れでプログラムを組みます。

  1. アプリケーションのウィンドウハンドル取得
  2. 最前面に表示(移動)させる

この方法はデスクトップアプリケーションに対しての方法であり、ブラウザは対応していませんのでご注意ください。

ブラウザの操作はSeleniumなどを使用して操作することができます。

ウィンドウハンドルを取得する

まず初めに最前面に表示させるアプリケーションのウィンドウハンドルを取得します。

ウィンドウハンドルの取得にはwin32guiのFindWindow関数を使用します。

hwnd = win32gui.FindWindow(class, title)

ここではアプリケーションのウィンドウタイトルをキーにして、ウィンドウハンドルを取得します。

titleにはターゲットアプリケーションのウィンドウタイトルを指定します。
classにはNoneを指定してください。

FindWindow関数で取得したウィンドウハンドルはhwndに代入されます。

ウィンドウハンドルの取得には以下のようにctypesモジュールのFindWindowWを使っても取得できます。

hwnd = ctypes.windll.user32.FindWindowW(0, title)

もし取得したウィンドウハンドルを表示したい場合は、hex関数で16進数表記にします。

print(hex(hwnd))

ウィンドウハンドルが正しい値か調べたいならvisual studioの付属ツール spy++を使うといいです。

最前面に表示させる

アプリケーションを最前面に表示させるためにwin32guiのSetWindowPos関数を使用します。

win32gui.SetWindowPos(hwnd,win32con.HWND_TOPMOST,0,0,0,0,win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)

SetWindowPos関数の第一引数には、 FindWindow関数で取得したウィンドウハンドルを指定します。

SetWindowPos関数によりアプリは最前面に表示され、かつ最前面表示で固定されます。

他のウィンドウをアクティブにしても最前面にしたアプリは最前面表示で固定され続けます。

ウィンドウの最前面表示で注意していただきたいのが、win32guiのSetForegroundWindow()では今は前面表示ができないということです。

古い記事でたまに紹介されていますが、Windows10ではうまく機能しませんのでご注意ください。

アプリケーションをアクティブにする

RPAなどで特定のアプリケーションを操作するにはアクティブ化(アクティブウィンドウ)する必要があります。

アクティブ化する方法は複数ありますが、ここではpyautoguiモジュールを使ってアクティブ化してみたいと思います。

pyautoguiモジュールのmoveTo()メソッドでカーソルをアプリウィンドウ上へ移動し、click()メソッドでクリックすることでアクティブ化します。

サンプルプログラム

以下にアプリケーションを最前面表示させ、アクティブ化させるサンプルプログラムを記します。

ここではアプリケーションのウィンドウタイトルをOffice54としています。

import win32gui
import win32con
import win32api
import pyautogui

def foreground():
    hwnd = win32gui.FindWindow(None, "Office54")
    win32gui.SetWindowPos(hwnd,win32con.HWND_TOPMOST,0,0,0,0,win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)

    left, top, right, bottom = win32gui.GetWindowRect(hwnd)
    pyautogui.moveTo(left+60, top + 10)
    pyautogui.click()

if __name__ == '__main__':
    foreground()

まとめ

本記事「【Python】Windows10:アプリケーションを最前面に表示・アクティブ化させる方法」はいかがでしたか。

PythonでWindows用のRPAプログラムを作成する際などで、利用できる技術だったかと思います。

ウィンドウハンドルを取得して操作するというのは、なかなか難しいことではありますが、できるようになると様々なことに応用できます。

ぜひいろいろ試してみてください。