コンピュータや音楽の事書いてます

Officeリボン上でのIMEの状態制御

通常の.Netのtextboxなどには、ImeModeプロパティがあるので、簡単にIMEのON・OFFが出来るが、Officeのリボンのメニューに置いたeditBox(Microsoft.Office.Tools.Ribbon.RibbonEditBox)にはそれが無く、IMEを毎回手動でOFFにしなければならない。
Imm32.dllを使ったら自動に出来た。

宣言

[DllImport("Imm32.dll")]
private extern static int ImmSetOpenStatus(IntPtr hIMC, int fOpen);
[DllImport("Imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hWnd);

以下はPowerPointの場合。appは都合の良い場所で定義しておく。

Microsoft.Office.Interop.PowerPoint.Application app = new powerpoint.Application();

入力モードを指定したいタイミングの直前に以下が動くようにしておく。ImmSetOpenStatusの2つ目の引数は 0:OFF , 1:ON

IntPtr himc = ImmGetContext((IntPtr)app.ActiveWindow.HWND); //appのハンドルからコンテキストを取得する。HWNDはC#だとintで宣言されているが、内部的にはIntPtrのはず。
ImmSetOpenStatus(himc, 0);