win: クリップボードに格納するとIME入力がおかしくなる(未解決→対処)
2025/03/29
はじめに(2025/03/30)
仮対策
- AutoHotKey のクリップボード監視を使い、変更されたときに ctfmon.exe プロセスを kill する
今のところ分かったこと
- クリップボードに格納後、IME が 30秒間使えなくなる
- ATOKだけでなくIME全般
- ctfmon.exe のプロセスを kill すると直っている(勝手に復帰する)
現象
最近、作業環境をノートPC(Win11 Home 23H2)からデスクトップPC(Win11 Pro 23H2)に戻ったのだが、typoが多くなった。 いろいろ試したところ、コピーなり切り取りなりでクリップボードに格納した後に日本語入力IMEがおかしくなることがわかった。
これは ATOK と MS Word だが、他のアプリでは日本語入力ができないままになる。
非常にやっかいな現象だ。
そして・・・突然直ったりする。 これを書いている今がそれだ・・・。
書いているのは vscode なのだが動画を作ったばかりの MS Word でも起きなくなった。
やったのは、動画を作ったので vscode を立ち上げて入力しているだけだ。
えー、これ昨日からずっと困ってたのに。
ATOKの再インストールや、他の設定をいじったりして、元に戻せるかどうか分からないくらいまでなっている。
検索すると “テキストインプットサービス” や “ctfmon.exe” などがよく出てくるのだが、 ctfmon.exe を立ち上げるとその時は直るものの、また Ctrl+C などすると戻ってしまったのだ。
うーーーん・・・・。
その後
PC を再起動したら発生した。ほらね。
一つ分かったのは、時間経過なのかわからないが急に直るということだ。
キーを押しっぱなしにしているだけなのだが急に IME が復帰している。
時間を測ったが、ちょうど30秒だ。
どれかのプロセスが再起動したとかだろうか。
また、この現象は IME が ON だろうが OFF だろうが関係なく発生している。
OFF の状態でコピーすると IME ON のキー(私は JISキーボードで「変換キー」に割り当てている)を押しても反応しない。
MS-IME を前面に出していても現象は同じなので、おそらく ATOK が原因というわけではない。
クリップボードが原因のトリガーになっているので無効にしていたクリップボード履歴を使えるようにしたものの変わらず。
有効にしたが変わらない。
イベントビューアで何か起きていないか探そうとしたが、これはやり方がよくわからなかった。
現象を起こすことはできるので時間指定でイベントを探そうとしたのだが、やり方が悪かったのだろうか。
ファイアウォールを無効してみたが、関係なし。
まあ、そうだろう。
ctfmon.exe 関係でネット検索するが、ほどよい情報がない。
だいたい “.exe” で検索すると、ウイルスがどうこうと大半が自動で作ったような記事がヒットして困る。
自動起動していないというのは当てはまらない。
現象が起きてすぐに ctfmon.exe をタスクマネージャーで停止させると直る。
単にタスクマネージャーにウィンドウを切り替えただけだったり停止ダイアログを表示するだけだと直らないので、
そういった要素で直ったわけではないはずだ。
ctfmon.exe 以外でも直るのかもしれないが、OfficeClickToRun.exe では(これも自動復帰する)直らなかったので、少なくとも何でもよいというわけでもなさそうだ。
TextInputHost.exe も似た雰囲気があるがダメだった。
Common Text Framework、恐るべし。。。
ctfmon.exe が出てきたので少しやったが、regsvr しても効果は無かった。 まあ、立ち上がってるしね。
同一PC で別のadminアカウントがあるのだが、そちらでは起きなかった。
なので共通で使っているファイルに原因があるわけではないだろう。
昔悩んでいた PNG のプレビュー画像が表示されないときもそうだったが、
別アカウントを作ってください、は対処じゃないと思うのだよ。
最近は AppData にインストールするものもあるし。
レジストリはマルチアカウントのためにやってたんじゃないのかと思うが、どうしようもなくなったのか。
AutoHotKey
根本的な対策はあきらめた。
私の環境では AutoHotKey を立ち上げているのだが、 クリップボードに変化があったらコールバックを受け取ることができるので、 そのタイミングで ctfmon.exe プロセスを閉じてしまおう。
AutoHotKey v2 ではこんな感じ(v1は見てない)。
OnClipboardChange ClipChanged
ClipChanged(DataType) {
ProcessClose "ctfmon.exe"
}
コピーしてすぐ操作すると間に合わないかもしれないが、 心に余裕を持って操作すれば大丈夫だろう。