会社ノートPCの狭い画面での業務は非効率極まりないので
とりあえず任意のアプリケーションを最前面にする事でお茶を濁すことにしました
拡張用のモニターが欲しいですね
#はじめに
タイトルまんまです。
こんな感じにTkinterでGUIを作って、ウィンドウ名の一部をテキストボックスに入力し、ON/OFFします。
#要点
- .findを使って部分一致でウィンドウ名を探す
- SetWindowPosを使う
#先にコード
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()
#解説らしきこと
import win32gui, win32con
import tkinter as tk
from tkinter import ttk
ここで必要なライブラリをインポートします
ttkの行は必須ではないですが、今回は見た目の好みの問題で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
ここについてはこちらの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…