Открыть (редактор метода ввода) IME Pad программно в C # - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь активировать IME Pad через C #.Но это невозможно.

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();
    }
}

Поэтому я установил ImeMode на ImeMode.On.Затем, после загрузки формы, я запускаю C:\Windows\System32\IME\shared\IMEPADSV.EXE.

Selecting IME Pad in taskbar

Если я вручную выбрал язык, нажмите на символ A и выберите IMEPad его работает нормально.Панель IME видна, если я нажимаю на текстовое поле.Но когда я делаю это программно, это не работает.

Как решить эту проблему и запустить IME Pad с ImeMode.On?

Заранее спасибо!

//редактировать: Когда я заменяю этот файл самодельным C # EXE-файлом, который регистрирует вызов, я обнаруживаю, что Windows вызывает программное обеспечение следующим образом.

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

Рабочий путь: C: \ Windows \ system32текущий зарегистрирован в одном с Interactive режиме.

...