###実現しようとしていること
全角ひらがなや半角などIME入力モードが変更可能なテキストボックスにテンキーボタンまたはキーボードを使って文字列入力ができるようにしたい。
###困っていること
テキストボックスのIME入力モードが全角ひらがな状態で,テンキーボタンを使って,数字(0~9)をクリックすると半角ではなく全角が入力されてしまう。テンキーボタンをクリックしたとき,テキストボックスのIME入力モードが半角(Alpha)でなかったら,半角(Alpha)にして,SendKeysクラスのSend()メソッドで送信すればよいと思ったのですが,全角になってしまいます。SendKeysクラスのSend()メソッドではバグがあり,不可能なのでしょうか?SendKeys()クラスのSend()メソッドを使わなくてもできるとは思うのですが,現在アプリを作成中であまり変更したくありません。絶対に不可能な場合は変更します。どなたかご教授お願いいたします。
###試したことおよび調べたこと
- テキストボックスのIMEモードについて調べていたらWindows 7、Windows Vista で Microsoft Office IME 2010、Microsoft Office IME 2007 を既定の言語として設定している場合、テキスト ボックスで入力モードが正しく反映されないことがあるを見つけたので,既定の言語を「Microsoft Office IME 2007」→「Microsoft IME」に変更したが,全角になってしまう。
- ログ出力して,送信前の変更前がHiragana(全角ひらがな),送信前の変更後がAlpha(半角)になっていることは確認しました。
###実行時のアプリ画面
コントロール一覧
・ボタン10個 TextおよびTagプロパティ(0~9), Size(W, H)=(70, 50), それ以外デフォルト, OnTenkeyイベント
・テキストボックス1個 Font(MS ゴシック,18PT), ImeMode=Hiragana, Size(W, H)=(567, 31)
Location(L, T)は見た目似ていれば大丈夫です。
テンキー0をクリック後の画面
###ソース
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp1 12{ 13 public partial class Form1 : Form 14 { 15 /// <summary> 16 /// コンストラクタ 17 /// </summary> 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 /// <summary> 23 /// テンキークリックイベント 24 /// </summary> 25 /// <param name="sender"></param> 26 /// <param name="e"></param> 27 private void OnTenkey(object sender, EventArgs e) 28 { 29 // テキストボックスにフォーカスをセット 30 textBox1.Focus(); 31 // 入力文字の取得 32 string input = (string)((Button)sender).Tag; 33 // テキストボックスのIME入力モード状態 34 System.Windows.Forms.ImeMode imeMode; 35 36 // テキストボックスのIME入力モードがAlpha(半角英数)でない(全角ひらがな等)場合 37 if (textBox1.ImeMode != ImeMode.Alpha) 38 { 39 // 現在のIME入力モードを保存 40 imeMode = textBox1.ImeMode; 41 // ログ出力 42 Console.WriteLine("送信前-変更前のIME入力モード:" + imeMode.ToString()); 43 // テキストボックスのIME入力モードをAlpha(半角英数)にする 44 textBox1.ImeMode = ImeMode.Alpha; 45 // ログ出力 46 Console.WriteLine("送信前-変更後のIME入力モード:" + textBox1.ImeMode.ToString()); 47 Console.WriteLine("送信文字列:" + input); 48 // 入力文字のキーを送る 49 SendKeys.Send(input); 50 SendKeys.Send("{Enter}"); 51 // テキストボックスのIME入力モードを元に戻す 52 textBox1.ImeMode = imeMode; 53 // ログ出力 54 Console.WriteLine("送信後-元に戻した後のIME入力モード:" + textBox1.ImeMode.ToString()); 55 } 56 // テキストボックスのIME入力モードがAlphaの場合 57 else 58 { 59 // 入力文字のキーを送る 60 SendKeys.Send(input); 61 } 62 } 63 } 64} 65
###開発環境
OS:Windows7 64bit
IDE:Visual Studio Professional 2017
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/13 05:55