普通に TextBox を配置して、IME 変換中にマウスの左ボタンを押したまま、Enter キーを押してみてください。
入力候補がキャンセルされ IME が閉じます。
つまり、SendKeys.Send("~"); で Enter キーはちゃんと送信できていることになります。
メモ帳で左ボタンを押しながら Enter キーを押すと、未確定の変換候補が確定するので、.NET の TextBox 固有の動作のようです。
TextBox を継承してカスタムコントロールを作ってみましたが、こういうところをいじってしまうとあとでハマりそうな気がします。
C#
1namespace WindowsFormsApp1
2{
3 using System;
4 using System.Diagnostics;
5 using System.Runtime.InteropServices;
6 using System.Windows.Forms;
7
8 public class TextBoxEx : TextBox
9 {
10 private static class NativeMethods
11 {
12 private class ExternDll
13 {
14 public const string Imm32 = "Imm32.dll";
15 }
16
17 public const int
18 WM_LBUTTONDOWN = 0x0201,
19 NI_COMPOSITIONSTR = 0x0015,
20 GCS_COMPSTR = 0x0008,
21 CPS_COMPLETE = 0x01;
22
23 [DllImport(ExternDll.Imm32, CharSet = CharSet.Auto)]
24 public static extern IntPtr ImmGetContext(HandleRef hWnd);
25
26 [DllImport(ExternDll.Imm32, CharSet = CharSet.Auto)]
27 public static extern bool ImmReleaseContext(HandleRef hWnd, HandleRef hIMC);
28
29 [DllImport(ExternDll.Imm32, CharSet = CharSet.Auto)]
30 public static extern bool ImmNotifyIME(HandleRef hIMC, int dwAction, int dwIndex, int dwValue);
31
32 [DllImport(ExternDll.Imm32, CharSet = CharSet.Unicode)]
33 public static extern int ImmGetCompositionString(HandleRef hIMC, int dwIndex, IntPtr lpbuf, int dwBufLen);
34 }
35
36 protected override void WndProc(ref Message m) {
37 switch (m.Msg) {
38 case NativeMethods.WM_LBUTTONDOWN:
39 WmButtonDown(ref m);
40 break;
41 default:
42 base.WndProc(ref m);
43 break;
44 }
45 }
46
47 private void WmButtonDown(ref Message m) {
48 var hwnd = new HandleRef(this, (this.Handle));
49 var himc = new HandleRef(this, NativeMethods.ImmGetContext(hwnd));
50 if (himc.Handle != IntPtr.Zero) {
51 try {
52 // 確定したときの文字列長を取得
53 var length = NativeMethods.ImmGetCompositionString(himc, NativeMethods.GCS_COMPSTR, IntPtr.Zero, 0);
54 if (length > 0) {
55 // 長さゼロでなければ確定
56 NativeMethods.ImmNotifyIME(himc, NativeMethods.NI_COMPOSITIONSTR, NativeMethods.CPS_COMPLETE, 0);
57 // WndProc は実行しない
58 return;
59 }
60 } finally {
61 NativeMethods.ImmReleaseContext(hwnd, himc);
62 }
63 } else {
64 Debug.Fail("Could not get IME input context.");
65 }
66 base.WndProc(ref m);
67 }
68 }
69}