LoginSignup
3
3

More than 1 year has passed since last update.

Pythonで任意のアプリケーションを最前面にする

Posted at

会社ノートPCの狭い画面での業務は非効率極まりないので
とりあえず任意のアプリケーションを最前面にする事でお茶を濁すことにしました
拡張用のモニターが欲しいですね

はじめに

setwinpos.png
タイトルまんまです。
こんな感じにTkinterでGUIを作って、ウィンドウ名の一部をテキストボックスに入力し、ON/OFFします。

要点

  • .findを使って部分一致でウィンドウ名を探す
  • SetWindowPosを使う

先にコード

SetWinPos.py
import win32gui, win32con
import tkinter as tk
from tkinter import ttk

def foreground_on(hwnd, title):
    name = win32gui.GetWindowText(hwnd)
    if name.find(title) >= 0:
        #最前面ON
        win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
        return

def foreground_off(hwnd, title):
    name = win32gui.GetWindowText(hwnd)
    if name.find(title) >= 0:
        #最前面OFF
        win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
        return

mainWnd = tk.Tk()
mainWnd.title(u"SetWinPos")
mainWnd.geometry("250x100")

def Button_1():
    value = EditBox.get()
    win32gui.EnumWindows(foreground_on, value)

def Button_2():
    value = EditBox.get()
    win32gui.EnumWindows(foreground_off, value)

#エントリー
EditBox = ttk.Entry()
EditBox.insert(tk.END,"メモ帳")
EditBox.pack(expand = True, fill = tk.BOTH, padx = 5, pady = 5)
#ボタン1
Button1 = ttk.Button(text='最前面ON', command=Button_1) 
Button1.pack(expand = True, fill = tk.BOTH, padx = 5)
#ボタン2
Button2 = ttk.Button(text='最前面OFF', command=Button_2) 
Button2.pack(expand = True, fill = tk.BOTH, padx = 5, pady = 5)

mainWnd.mainloop()

解説らしきこと

SetWinPos.py
import win32gui, win32con
import tkinter as tk
from tkinter import ttk

ここで必要なライブラリをインポートします
ttkの行は必須ではないですが、今回は見た目の好みの問題でttkを使いました。

SetWinPos.py
def foreground_on(hwnd, title):
    name = win32gui.GetWindowText(hwnd)
    if name.find(title) >= 0:
        #最前面ON
        win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
        return

ここについてはこちらのQAのものがベースです。
QAではreturn時にFalseを返していますが、動作はするもののエラーを吐いてしまいますので削除。
SetForegroundWindowでは今回の目的は達成出来ないのでSetWindowPosに変えます。
処理の流れとしては、
GetWindowTextで取得したフォアグラウンドウィンドウの名前から.findで検索をかけ
検索で見つかれば、そのウィンドウをwin32con.HWND_TOPMOST(最前面)に設定。
def foreground_offは、同様にwin32con.HWND_NOTOPMOST(最前面解除)に設定。

SetWindowPosについてはこちらの記事に解説があります。

以降はTKでのGUI構築なので省略します。

おわりに

pywin32を使わずにctypesで書ければ、追加ライブラリのインストールなしで動作させられそうですね。
こんな小さなコードでもPyinstallerでexe化したら9.5MBほどになってしまいます。
UPXかけても9.4MB…

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3