此篇在說明如何控制特定可以設定ImeMode的物件,如TextBox之類的元件控制設定值
如果是單純只是要設定英數/中文輸入法的方法非常簡單,只需要將物件的XXX,ImeMode設定為ImeMode.On或ImeMode.OnHalf,這些設定值定義可以直接在微軟的官網中找到說明文件,在此就不多做贅述。
今天要來說明的是如何改變輸入法的全/半型(全/半角)
首先的是必須了解imemode裡應傳控的控制參數值為何:
標準模式(例如智能ABC的標準模式)
輸入法狀態 | mode值 |
中文輸入-半型-中文符號 | 1025 |
中文輸入-全型-中文符號 | 1033 |
中文輸入-半型-英文符號 | 1 |
中文輸入-全型-英文符號 | 9 |
英文輸入-半型-中文符號 | 1024 |
英文輸入-全型-中文符號 | 1032 |
英文輸入-半型-英文符號 | 0 |
英文輸入-全型-英文符號 | 8 |
另外一份則是sentence值:
模式 | 值 |
般 | 8 |
名 | 1 |
話 | 16 |
無 | 0 |
有了以上的兩個值,我們就能針對物件做ImeMode做指定了
[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);
public const int IME_CMODE_FULLSHAPE = 0x8;
public const int IME_CHOTKEY_SHAPE_TOGGLE = 0x11;
/// <summary>
/// 修改輸入法狀態
/// </summary>
/// <param name="h"></param>
public static void SetInputLanguage(IntPtr h)
{
IntPtr HIme = ImmGetContext(h);
ImmSetOpenStatus(HIme, true);
if (ImmGetOpenStatus(HIme)) //如果輸入法處於打開狀態
{
int iMode = 1033;
int iSentence = 0;
//使用值參考以上列表
bool bSuccess = ImmGetConversionStatus(HIme, ref iMode, ref iSentence); //檢索輸入法信息
if (bSuccess)
{
//if (!((iMode & IME_CMODE_FULLSHAPE) > 0)) //如果是半形
// ImmSimulateHotKey(h, IME_CHOTKEY_SHAPE_TOGGLE); //轉換成全形
}
}
}
就是這麼容易,再來只要在需要改變輸入法的地方直接呼叫就行了,例如:
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void TextBox1_MouseDown(object sender, MouseEventArgs e)
{
TextBox oTBox = (TextBox)sender;
SetInputLanguage((IntPtr)((Control)sender).Handle);
}
參考網址:
http://www.cnblogs.com/alexander-lee/archive/2009/11/23/1608633.html