Я пытаюсь активировать 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
.
Если я вручную выбрал язык, нажмите на символ A и выберите IMEPad его работает нормально.Панель IME видна, если я нажимаю на текстовое поле.Но когда я делаю это программно, это не работает.
Как решить эту проблему и запустить IME Pad с ImeMode.On?
Заранее спасибо!
//редактировать: Когда я заменяю этот файл самодельным C # EXE-файлом, который регистрирует вызов, я обнаруживаю, что Windows вызывает программное обеспечение следующим образом.
C:\Windows\System32\IME\SHARED\imepadsv.exe -Embedding
Рабочий путь: C: \ Windows \ system32текущий зарегистрирован в одном с Interactive
режиме.