1using System.Runtime.InteropServices;
13internal static class ImeHelper
23 private const uint IME_CMODE_NATIVE = 0x0001;
49 [DllImport(
"imm32.dll")]
50 private static extern IntPtr ImmGetContext(IntPtr hWnd);
84 [DllImport(
"imm32.dll")]
85 private static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
111 [DllImport(
"imm32.dll")]
112 private static extern bool ImmGetOpenStatus(IntPtr hIMC);
146 [DllImport(
"imm32.dll")]
147 private static extern bool ImmSetOpenStatus(IntPtr hIMC,
bool open);
189 [DllImport(
"imm32.dll")]
190 private static extern bool ImmGetConversionStatus(IntPtr hIMC, out uint conversion, out uint sentence);
232 [DllImport(
"imm32.dll")]
233 private static extern bool ImmSetConversionStatus(IntPtr hIMC, uint conversion, uint sentence);
259 public static bool IsNativeMode(IntPtr hwnd)
261 if (hwnd == IntPtr.Zero)
264 var context = ImmGetContext(hwnd);
265 if (context == IntPtr.Zero)
270 if (!ImmGetOpenStatus(context))
273 return ImmGetConversionStatus(context, out var conversion, out _) &&
274 (conversion & IME_CMODE_NATIVE) != 0;
278 ImmReleaseContext(hwnd, context);
314 public static bool SetNativeMode(IntPtr hwnd,
bool native)
316 if (hwnd == IntPtr.Zero)
319 var context = ImmGetContext(hwnd);
320 if (context == IntPtr.Zero)
325 ImmSetOpenStatus(context, native);
327 if (ImmGetConversionStatus(context, out var conversion, out var sentence))
329 conversion = native ? conversion | IME_CMODE_NATIVE : conversion & ~IME_CMODE_NATIVE;
330 ImmSetConversionStatus(context, conversion, sentence);
337 ImmReleaseContext(hwnd, context);