在WINFORM中我們經常遇到文本輸入框中IME被禁用或老是變全形IME等問題,經查閱相關資料,現小結如下:
(一)Control.ImeMode 屬性:擷取或設定控制項的輸入法 (IME) 模式。
(1)由於表單內容繼承關係,如果你的WINFORM表單中大部分需要設定為IME有效狀態,可以設定為FORM的ImeMode屬性為On.
(2)如果需要某些TextBox為IME有效,則使用ImeMode.On
(3)如果需要設定整個表單的IME全部為半形,可以使用以下代碼:
#region 修正IME全形/半形的問題
//聲明一些API函數
[DllImport("imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hwnd);
[DllImport("imm32.dll")]
public static extern bool ImmGetOpenStatus(IntPtr himc);
[DllImport("imm32.dll")]
public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);
[DllImport("imm32.dll")]
public static extern bool ImmGetConversionStatus(IntPtr himc, ref int lpdw, ref int lpdw2);
[DllImport("imm32.dll")]
public static extern int ImmSimulateHotKey(IntPtr hwnd, int lngHotkey);
private const int IME_CMODE_FULLSHAPE = 0x8;
private const int IME_CHOTKEY_SHAPE_TOGGLE = 0x11;
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
IntPtr HIme = ImmGetContext(this.Handle);
//如果IME處於開啟狀態
if (ImmGetOpenStatus(HIme))
{
int iMode = 0;
int iSentence = 0;
//檢索IME資訊
bool bSuccess = ImmGetConversionStatus(HIme, ref iMode, ref iSentence);
if (bSuccess)
{
//如果是全形,轉換成半形
if ((iMode & IME_CMODE_FULLSHAPE) > 0)
ImmSimulateHotKey(this.Handle, IME_CHOTKEY_SHAPE_TOGGLE);
}
}
}
#endregion 修正IME全形/半形的問題
注意:需要引用以下命名空間:using System.Runtime.InteropServices;
(4)對於僅用於輸入數值的 TextBox 控制項,ImeMode 屬性通常設定為 ImeMode.Off。對於 Form 類,ImeMode 屬性值設定為 ImeMode.NoControl。
(5)不直接支援輸入方法編輯器或允許從 IME 直接輸入的大多數類將此屬性的值設定為 NoControl。
重要事項:
除非 ImeMode 已經以編程方式設定為 ImeMode.Disable,否則使用者能夠以互動方式更改它。在前一種情況下,使用者將無法使用 IME。
(二)ImeMode各屬性的含義:
ImeMode 枚舉:指定一個值,該值是用來確定在選定了對象時該對象的輸入法 (IME) 的狀態。
以下是微軟的解釋:
| |
成員名稱 |
說明 |
|
Alpha |
字母數字單位元組字元 (SBC)。此設定僅對朝鮮語和日語 IME 有效。 |
|
AlphaFull |
字母數字雙位元組字元。此設定僅對朝鮮語和日語 IME 有效。 |
|
Close |
|
|
Disable |
IME 被禁用。如果使用此設定,則使用者無法從鍵盤開啟 IME,而且 IME 浮動視窗處於隱藏狀態。 |
|
Hangul |
朝鮮文 SBC。此設定僅對朝鮮語 IME 有效。 |
|
HangulFull |
朝鮮文 DBC。此設定僅對朝鮮語 IME 有效。 |
|
Hiragana |
平假名 DBC。此設定僅對日語 IME 有效。 |
|
Inherit |
繼承父控制項的 IME 模式。 |
|
Katakana |
片假名 DBC。此設定僅對日語 IME 有效。 |
|
KatakanaHalf |
片假名 SBC。此設定僅對日語 IME 有效。 |
|
NoControl |
無(預設)。 |
|
Off |
IME 已關閉。此模式指示 IME 已關閉,這意味著該對象的行為方式與英語輸入模式相同。此設定僅對日語、簡體中文和繁體中文 IME 有效。 |
|
On |
IME 已開啟。此值指示 IME 已開啟,可以輸入中文或日語特定的字元。此設定僅對日語、簡體中文和繁體中文 IME 有效。 |
備忘:
輸入法 (IME) 允許使用者輸入和編輯中文、日語和朝鮮語字元。IME 是用於編寫中文、日語和朝鮮語指令碼的基本組件。這些書寫體系具有的字元比可為常規鍵盤編碼的字元要多。這些語言的 IME 使用描述單個字元或成組字元的基字元序列,以便允許您輸入範圍較廣的一組字元。基字元可以是來自朝鮮文音節的成分字母、日語漢字字元的拼音成分,或者中文字元的各種組合。
(三)如果設定為合適的IME?
這裡僅給一個例子,你可以舉一返三:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
public class Form1 : System.Windows.Forms.Form
{
RichTextBox rtb = new RichTextBox();
public Form1()
{
this.Controls.Add(rtb);
rtb.Dock = DockStyle.Fill;
this.InputLanguageChanged += new InputLanguageChangedEventHandler(languageChange);
}
private void languageChange(Object sender, InputLanguageChangedEventArgs e)
{
// If the input language is Japanese, set the initial IMEMode to Katakana.
if (e.InputLanguage.Culture.TwoLetterISOLanguageName.Equals("ja"))
{
rtb.ImeMode = System.Windows.Forms.ImeMode.Katakana;
}
}
public static void Main(string[] args)
{
Application.Run(new Form1());
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1665418