質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

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

Q&A

解決済

2回答

8842閲覧

全角ひらがな入力状態のテキストボックスにSendKeysクラスで数字を送信しようとすると半角にならず,全角になってしまう。

dem0nmichik0

総合スコア37

C#

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

1グッド

0クリップ

投稿2020/09/12 07:30

###実現しようとしていること
全角ひらがなや半角などIME入力モードが変更可能なテキストボックスにテンキーボタンまたはキーボードを使って文字列入力ができるようにしたい。

###困っていること
テキストボックスのIME入力モードが全角ひらがな状態で,テンキーボタンを使って,数字(0~9)をクリックすると半角ではなく全角が入力されてしまう。テンキーボタンをクリックしたとき,テキストボックスのIME入力モードが半角(Alpha)でなかったら,半角(Alpha)にして,SendKeysクラスのSend()メソッドで送信すればよいと思ったのですが,全角になってしまいます。SendKeysクラスのSend()メソッドではバグがあり,不可能なのでしょうか?SendKeys()クラスのSend()メソッドを使わなくてもできるとは思うのですが,現在アプリを作成中であまり変更したくありません。絶対に不可能な場合は変更します。どなたかご教授お願いいたします。

###試したことおよび調べたこと

###実行時のアプリ画面
コントロール一覧
・ボタン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

TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

手元ではSendKeys.SendWaitにすれば半角になりました。

投稿2020/09/12 08:54

TN8001

総合スコア9862

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

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

dem0nmichik0

2020/09/13 05:55

TN8001様、回答ありがとうございます。 回答のとおり、SendWait()メソッドにしたら、半角になりました。ありがとうございます。
guest

0

なぜSendKeysにこだわるのかわかりませんが、未確定の文字はキャンセルしていいのであれば、

C#

1textBox1.Text += input;

で末尾に数字が付きますし、カーソル位置に挿入したいのであれば、

C#

1textBox1.SelectedText = input;

とすればいいのでは。

投稿2020/09/12 08:07

編集2020/09/12 08:11
Daregada

総合スコア11990

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

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

dem0nmichik0

2020/09/13 06:01

Daregada様、回答ありがとうございます。 TN8001様の回答により、解決いたしました。回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問