まだ寒いのですが、花粉はちゃんと飛ぶようですね。花粉症なので薬を処方してもらうために近くの病院へ行きました。最近はマイナンバーカードを保険証として利用するための機器がどの病院でも設置されているのですが、あからさまにマイナンバーカードを使わせない病院もあるようです。WSLgのGUIがWindows IMEからの入力を拒否するように。
機械まで置いてあるのに使わせないって、なんか日本語表示できるのに入力できない、と同じ感じしませんか?
WSLgで日本語入力
"WSLg 日本語入力" くらいで検索すると見つかります。個人的には日付の新しいものを参照するようにしています。
要は、WSL側に fcitx, mozcなどでX window の場合のように、環境を整えるというものです。これはこれで使えると思います。
WSLgに日本語入力
でも、本当は Windows 側のIME使いたいですよね。個人的には使いたいです。
Windowsからの日本語入力を受け付けないWSLgですが、一点入力できるものがありました。コピペです。Windows側で日本語を含むテキストをコピーして、WSLg上のGUIで貼り付けるとうまく入力できます。
なので、fcitxだのmozcだの準備するの面倒で、でもその場しのぎで何とかしたい場合は、メモ帳などのエディタを開いてテキストを入力しておき、そこからコピペすればなんとかなりそうです。
コピペするアプリ
でも、なんとなく面倒です。いや、変なアプリ作る方が面倒だと言われたら身も蓋もないのですが、適当にテキストを入力できて、最後にEnterを押すと適当なところに、ペーストするアプリを作ってみました。処理の手順としては、
- 一度 clipboard にテキストを挿入
- ペースト先にフォーカスを移動させる
- キーイベント"^v"を送る
フォーカスを移動させる方法をちょっと悩みましたが、自分が起動する直前のアプリが入力先であるということにし、自分を一瞬消すことで自然に元のアプリにフォーカスを移動させることにしました。
そのため、ホットキーで起動できるようにしてあります。
ソースはこちら(GitHub)です。
自分を隠して、ペーストするしくみはこのあたりです。
// send key event
private async void SendKeyEventToAnotherWindow(string etext)
{
POINT cursorPos;
this.Hide();
await Task.Delay(200);
if (GetCursorPos(out cursorPos))
{
// カーソル位置にクリップボードのテキストを挿入
SendKeys.SendWait(etext);
}
this.Show();
}
200ms待つとか細かいことやっていますが、時間は適当です。ウィンドウがきりかわるのに時間がかかる場合は、調整してみてください。
また、キーイベントはいろいろ送ることができるので、矢印キーとかも元のGUIに戻らなくても使えるようにしています。
おわりに
自分を隠してフォーカスを移動させているので、Enterを押したときの挙動が不思議な感じですが、もし他に目的のウィンドウにキーイベントを送るうまい方法があれば、そちらに修正するのがよさそうです。
これでバンバン日本語を入力できるようになる、というわけではないですし、メモ帳起動させておくのと比べてどうよと言われたら、まぁ、変わらないかも。