PowerShellでコマンド実行したらIMEをオフにする

  1. 日本語打つためにIMEオンにする
  2. コマンド実行する
  3. 次にコマンド打とうとしたらIMEオンでムキーってなる

ということがあるよね、わかるよ

なのでprompt()でIME状態を検知して、オンになってたらオフにしたかった
最初はGetKeyStateで0xF4キーのトグル状態がオンだったら0xF3を押すような感じにしていたんだけど、IMEの状態がプロセスごとなのに対して前述のキー状態は全体で共有だから、齟齬が出ちゃうと途端に変な動きに
困りますね
困ってました

今日改めてぐぐってみた
すると、WM_IME_CONTROLSendMessageしてやると状態の取得も切り替えもできるということがわかったのだ

  1. (ps -Id $PID).MainWindowHandle で自分のウィンドウハンドルを取る
  2. 取れてなかったら取れるまで親PIDを遡る(※)
  3. ImmGetDefaultIMEWndでIMEのウィンドウハンドルを得る
  4. SendMessageでやりたい放題

※ ふつうにPowerShell使う場合は問題ないんだけど、ConEmuだと必要

快適ですわ!
快適ですわ!

追記:2018/04/03
質問があったのでIME制御部分のコードを載っけときます

クラス定義の部分は早い段階で一度だけ呼んでおけば良いので $PROFILE 等でやっておきましょう
(名前空間とかクラス名とかメソッド名なんかはお好みで変更してもいいんですよ)
そして IMEがオンだったらオフにする の部分は prompt 内に書いておいてください
$HWND にはPowerShellが動いてるウィンドウのハンドルを入れます
これも $PROFILE で最初にやっとくと良いでしょう

広告

PowerShellでコマンド実行したらIMEをオフにする」への3件のフィードバック

  1. はじめまして。
    仕事で日本語データを多く扱うのですが,コンソール上でのIME誤操作に悩まされてどうにか自動化できないものかとこちらの記事にたどり着きました。
    「2. 取れてなかったら取れるまで親PIDを遡る」までは何とかできたのですが,powershell以外の知識が乏しくてそれ以降がどうにも進めません……

    どのようなコードを書かれたのか,教えていただけないでしょうか?

      • 別言語でクラスを作成することまで出来るんですね。勉強になります。
        さっそく活用させていただきます。ありがとうございました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

w

%s と連携中