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
.
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.