Open (input method editor) IME Pad programmatically in C#

时间:2018-11-13 14:18:55

标签: c# winforms ime cjk

I'm trying to activate the IME Pad via C#. But it's not possible.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class FormMain : Form
{
    IntPtr m_hImc;

    public const int WM_IME_SETCONTEXT = 0x0281;

    [DllImport("Imm32.dll")]
    public static extern IntPtr ImmGetContext(IntPtr hWnd);

    [DllImport("Imm32.dll")]
    public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC);

    private IContainer components = null;
    private TextBox textBox1;

    public FormMain()
    {
        InitializeComponent();

        ImeMode = ImeMode.On;
        Load += (sender, args) =>
        {
            m_hImc = ImmGetContext(Handle);
            Process.Start(@"C:\Windows\System32\IME\shared\IMEPADSV.EXE");
        };
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_IME_SETCONTEXT && m.WParam.ToInt32() == 1)
        {
            ImmAssociateContext(Handle, m_hImc);
        }
    }
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    protected void InitializeComponent()
    {
        textBox1 = new TextBox();
        SuspendLayout();
        // 
        // textBox1
        // 
        textBox1.Anchor = (AnchorStyles.Top | AnchorStyles.Left)
                          | AnchorStyles.Right;
        textBox1.ImeMode = ImeMode.On;
        textBox1.Location = new Point(12, 12);
        textBox1.Name = "textBox1";
        textBox1.Size = new Size(327, 20);
        textBox1.TabIndex = 0;
        // 
        // FormMain
        // 
        AutoScaleDimensions = new SizeF(6F, 13F);
        AutoScaleMode = AutoScaleMode.Font;
        ClientSize = new Size(351, 43);
        Controls.Add(textBox1);
        Name = "FormMain";
        Text = "Example form";
        ResumeLayout(false);
        PerformLayout();
    }
}

So I set the ImeMode to ImeMode.On. Then after the form is load I start the C:\Windows\System32\IME\shared\IMEPADSV.EXE.

Selecting IME Pad in taskbar

If I manually select the language, click on the A-Symbol and select IME Pad its working fine. The IME Pad is visible if I click on a Textbox. But when I do this programmatically it is not working.

How to solve this issue and start the IME Pad with ImeMode.On?

Thanks in Advance!

//edit: When I replace this file with an self made C# EXE file which logs the call I find out that Windows calls the software like this.

C:\Windows\System32\IME\SHARED\imepadsv.exe -Embedding

Working path: C:\Windows\system32 User is the current logged in one with Interactive mode.

0 个答案:

没有答案