🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

4650閲覧

SendKeysでEnterを送信できない

Topaz

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/10/21 04:23

前提・実現したいこと

テキストボックスに文字を入力している最中、左クリックを行うとEnterキーを押したと見なして文字入力を確定させたい。

発生している問題・エラーメッセージ

現在は該当するテキストボックスのMouseDownにて、SendKeysでEnterを送信しようとしているが、入力している文字が削除されてしまう。Click・DoubleClickでも行おうとしたが左クリックを行うと入力している文字が削除され、右クリック等を行うと入力の確定が行われていた。

該当のソースコード

C#

1SendKeys.Send("~");

試したこと

テキストボックスのみを設置したフォームにて動作の確認を実施
NumLockがOFFになっている、またはCapsLockがONになっている場合の対処方法は実施済み。
SendKeys.SendWait()も期待する動作をせず。

補足情報(FW/ツールのバージョンなど)

Visual Studio2019、Windowsフォームアプリで作成

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/10/21 07:07

SendKeys.Send("~"); これでEnterを送出してるつもりなんでしょうか
guest

回答1

0

普通に 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}

投稿2019/10/23 05:36

KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問