🐍

PythonでIME(半角・全角)を切り替える

2024/12/09に公開

概要

pythonでIME(半角・全角)を切り替える方法を2種類紹介します。

環境

  • Windows10 64bit
  • Python 3.7.5
  • pynput 1.7.6

方法①:ウィンドウを指定してIME切り替え

python標準のライブラリだけで実行できるはずです。

例としてメモ帳のIMEを切り替えてみます。メモ帳を新規に立ち上げした状態で以下のコードを実行してみてください。

import ctypes
import win32gui
import win32con


user32 = ctypes.windll.user32
imm32 = ctypes.windll.imm32

# ウィンドウ名からウィンドウハンドル取得
h_wnd = win32gui.FindWindow(None, "無題 - メモ帳")

if 0 == h_wnd:
    print("エラー : ウィンドウが見つかりませんでした")
    exit()

# ウィンドウハンドルからIMEハンドルを取得
h_imc = imm32.ImmGetDefaultIMEWnd(h_wnd)

# IME切り替え。第4引数TrueでIMEオン、FalseでIMEオフ。0x006はIMC_SETOPENSTATUS
user32.SendMessageA(h_imc, win32con.WM_IME_CONTROL, 0x006, False)

# IMEの設定を確認。0x005はIMC_GETOPENSTATUS
IsImeOn = user32.SendMessageA(h_imc, win32con.WM_IME_CONTROL, 0x005, None)
print("IMEの設定確認 (1:オン 0:オフ) : " + str(IsImeOn))

参考

https://qiita.com/Yamine1San/items/65f564bd4c38e19f8d9f
↓IMC_SETOPENSTATUS(0x006)、IMC_GETOPENSTATUS(0x005)の情報
https://atstr.web.fc2.com/?make/doc/start-00

方法②:仮想キー入力によるIME切り替え

外部ライブラリのpynputによる仮想キー入力によってIMEを切り替えます。

IMEの設定はウィンドウごとに保存されていると思うので、この方法ではプログラム実行時にアクティブになっているウィンドウのIMEが切り替わることに注意してください。

どうやらキーボードの半角・全角キーは、キーコード243と244の状態をトグルスイッチのように切り替えているようです。

from pynput import keyboard
import time

KeyCon = keyboard.Controller()

# IMEをオンにする
KeyCon.press(keyboard.KeyCode.from_vk(243))
KeyCon.release(keyboard.KeyCode.from_vk(244))

time.sleep(3)

# IMEをオフにする
KeyCon.press(keyboard.KeyCode.from_vk(244))
KeyCon.release(keyboard.KeyCode.from_vk(243))
入力されたキーのキーコードを確認する方法

以下のプログラムを実行している状態でなにかキーボードのキーを押してみてください。キーの上げ下げとキーコードが出力されます

from pynput import keyboard


def win32_event_filter(msg, data):
    # msg >> キー下げ:257、キー上げ:256
    # data.vkCode >> キーコード
    print("msg : " + str(msg) + ", data.vkCode : " + str(data.vkCode))

# キーボード入力監視リスナー開始
with keyboard.Listener(on_press=None, on_release=None, win32_event_filter=win32_event_filter, suppress=False) as listener:
    listener.join()

参考

https://pynput.readthedocs.io/en/latest/index.html
https://github.com/moses-palmer/pynput/issues/170#issuecomment-602743287

Discussion