はじめに
タスクバー改造ツールで縦配置にして使っている都合上、原因不明で IME が ENG になってしまう
厄介なのは、大概は ENG だが、たまにそれ以外(設定が維持される)なので状態を見て切り替える必要がある
Python スクリプトで画面内特定位置の画像を撮影比較判定してIME を切り替える仕組みを作成する
環境
- Windows 11 Home
- Python 3.13
追加パッケージ
今回追加したパッケージリスト
バージョンは未確認
pip install pyautogui
pip install opencv-python
pip install pillow
スクリプト作成
認識元画像を準備する
タスクバーの IME 表示を ENG 状態で位置座標を確認してキャプチャする
スクリーン内、タスクバーの IME 領域の位置座標は「MPP Utility」を使用した
"""指定された領域をキャプチャーする"""
try:
# 画面キャプチャーを取得
x1 =2460; y1=1266; x2 =2550; y2 = 1292
image = pyautogui.screenshot(region=(x1, y1, x2-x1, y2-y1))
image.save("ime_eng.png", 'png')
except:
pass
準備は完了したので、目的の動作をするスクリプトを作成する
import pyautogui
import cv2
import numpy as np
from PIL import Image
import time
def main():
# 事前キャプチャー画像読み込み
image = Image.open("ime_eng.png")
# 指定領域をキャプチャーする
x1 =2460; y1=1266; x2 =2550; y2 = 1292
try:
# 画面キャプチャーを取得
img2 = pyautogui.screenshot(region=(x1, y1, x2-x1, y2-y1))
except:
sys.exit(-1)
if img2 != None:
# 画像を比較
try:
# PIL ImageをOpenCVのnumpy配列に変換
frame = np.array(image)
# RGBからBGRに変換(OpenCVの形式に合わせる)
frame1 = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
frame = np.array(img2)
frame2 = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
# 画像の形状が同じかチェック
if frame1.shape != frame2.shape:
sys.exit(-1)
# ピクセルごとの差分を計算
diff = cv2.absdiff(frame1, frame2)
# 差分の合計を計算
diff_sum = np.sum(diff)
#print("diff_sum="+str(diff_sum))
result = diff_sum < 90000 #閾値は必要に応じて調整
if result:
# 一致なら、IME を切り替える
# Windows の標準ショートカットキー Win+Space で IME 選択を1つ次に切り替える
pyautogui.hotkey('win','space')
except Exception as e:
print(f"比較に失敗しました: {str(e)}")
sys.exit(-1)
if __name__ == '__main__':
main()
IME が ENG なら、ショートカットキー発行して、IME を切り替える
注意点として、タスクバーが半透明なので背景の壁紙が変わると比較判定の比較差値に影響が出るので一致、不一致判定に適切な閾値を設定すること
まとめ
勝手にiMEがENGになる問題が解決すれば、全てが幸せになる話だが、そううまい話は無く
今回スクリプトを作成して、起動直後の一手間をラクできるしてみたが、いまいち納得できないでいる
それでも、PC上の操作を色々と自動でやってくれる Python と PyAutoGUI は素晴らしい