前提・実現したいこと
テキストボックスのIMEモードを個別に設定したいです。
現在、
TextBox1のIMEModeをひらがな
TextBox2のIMEModeを半角カタカナに設定し
TextBox1の入力内容のフリガナをTextBox2に入力してもらうような設計にしています。
しかし、実際に動かすとどちらもIMEModeがひらがなになってしまいます。
調べてみるとOSの設定を変更することで切り替えが可能になるらしいのですが、
できるだけOSに依存したくないです。
また、Enter時、もしくはTextBox2から離れるときに変換して反映することも考えたのですが
入力している間はひらがなが出てしまい、違和感があります。
解決方法をご教授いただきたいです。
言語はC#で、.NETFrameWork4.8を使用しています。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
Windows Forms で良いのでしょうかね。
これらのサイトを参考にどうぞ。
Windows 8, Window 10 で ImeModeが制御できない問題を解決する
【VB.NET】テキストボックスに入力する文字種を初期設定するには?
投稿2021/03/18 06:53
編集2021/03/18 06:56総合スコア211
0
あら。退会しちゃったのか。
折角書いてみたので、後のために晒しておきます。
軽くしか試していないので、ダメなところあるかも知れないです。
それっぽくは動きます。
使う時のクラス名は適宜変えてくださいね。
C#
1using System; 2using System.Runtime.InteropServices; 3using System.Windows.Forms;
C#
1public class TextBoxEx : TextBox 2{ 3 [DllImport("User32.dll")] 4 static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 5 [DllImport("imm32.dll")] 6 static extern IntPtr ImmGetDefaultIMEWnd(IntPtr hWnd); 7 8 const int WM_IME_CONTROL = 0x283; 9 const int IMC_GETCONVERSIONMODE = 1; 10 const int IMC_SETCONVERSIONMODE = 2; 11 const int IMC_GETOPENSTATUS = 5; 12 const int IMC_SETOPENSTATUS = 6; 13 14 const int IME_CMODE_NATIVE = 1; 15 const int IME_CMODE_KATAKANA = 2; 16 const int IME_CMODE_FULLSHAPE = 8; 17 const int IME_CMODE_ROMAN = 16; 18 19 const int CMode_Hiragana = IME_CMODE_ROMAN | IME_CMODE_FULLSHAPE | IME_CMODE_NATIVE; 20 const int CMode_Katakana = IME_CMODE_ROMAN | IME_CMODE_FULLSHAPE | IME_CMODE_KATAKANA | IME_CMODE_NATIVE; 21 const int CMode_KatakanaHarlf = IME_CMODE_ROMAN | IME_CMODE_KATAKANA | IME_CMODE_NATIVE; 22 const int CMode_AlphaFull = IME_CMODE_ROMAN | IME_CMODE_FULLSHAPE; 23 24 private ImeMode ime; 25 26 protected override ImeMode ImeModeBase 27 { 28 get { return base.ImeModeBase; } 29 set 30 { 31 ime = value; 32 base.ImeModeBase = value; 33 } 34 } 35 36 protected override void OnEnter(EventArgs e) 37 { 38 base.OnEnter(e); 39 40 ImeMode = ime; 41 42 var imwd = ImmGetDefaultIMEWnd(Handle); 43 44 switch (ImeMode) 45 { 46 case ImeMode.On: 47 SendMessage(imwd, WM_IME_CONTROL, (IntPtr)IMC_SETOPENSTATUS, new IntPtr()); 48 break; 49 case ImeMode.Off: 50 SendMessage(imwd, WM_IME_CONTROL, (IntPtr)IMC_SETOPENSTATUS, IntPtr.Zero); 51 break; 52 case ImeMode.Disable: 53 SendMessage(imwd, WM_IME_CONTROL, (IntPtr)IMC_SETOPENSTATUS, IntPtr.Zero); 54 break; 55 case ImeMode.Hiragana: 56 SendMessage(imwd, WM_IME_CONTROL, (IntPtr)IMC_SETCONVERSIONMODE, (IntPtr)CMode_Hiragana); 57 break; 58 case ImeMode.Katakana: 59 SendMessage(imwd, WM_IME_CONTROL, (IntPtr)IMC_SETCONVERSIONMODE, (IntPtr)CMode_Katakana); 60 break; 61 case ImeMode.KatakanaHalf: 62 SendMessage(imwd, WM_IME_CONTROL, (IntPtr)IMC_SETCONVERSIONMODE, (IntPtr)CMode_KatakanaHarlf); 63 break; 64 case ImeMode.AlphaFull: 65 SendMessage(imwd, WM_IME_CONTROL, (IntPtr)IMC_SETCONVERSIONMODE, (IntPtr)CMode_AlphaFull); 66 break; 67 case ImeMode.Alpha: 68 SendMessage(imwd, WM_IME_CONTROL, (IntPtr)IMC_SETCONVERSIONMODE, (IntPtr)IME_CMODE_ROMAN); 69 break; 70 default: 71 break; 72 } 73 } 74}
投稿2021/03/19 05:20
総合スコア211
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/03/18 06:58
2021/03/19 03:57
2021/03/19 05:38