输入法——讨厌的全角
今天遇到的一個(gè)輸入法全/半角的問(wèn)題,大致情形如下:用戶注冊(cè)界面中對(duì)用戶名及郵箱進(jìn)行驗(yàn)證、驗(yàn)證條件中有一項(xiàng)為“半角字符”,即全角字符不合法。
并且驗(yàn)證錯(cuò)誤時(shí)的提示信息也做的比較粗糙,提示的是什么“用戶名允許…字符,長(zhǎng)度是多少 ”等等,而恰好沒(méi)有提示到“半角字符”。
這時(shí)候某用戶開(kāi)始了一遍又一遍輸入他那全角的英文字符,然而總是注冊(cè)失敗,弄的很郁悶。
唉,用戶交互沒(méi)做好啊!再言之:WinForm里用錯(cuò)誤提示大多還是用那種“小紅圈”[ErrorProvider],錯(cuò)誤提示文本被隱藏了,不能被用戶直接看到。
還有當(dāng)時(shí)他似乎也沒(méi)有看錯(cuò)誤提示信息哦。仔細(xì)想想 這是用戶的錯(cuò)嗎? 似乎也不能責(zé)怪用戶吧!
既然遇到問(wèn)題了,那就解決吧。
解決思路:當(dāng)滿足以下三個(gè)條件中任意一個(gè)時(shí)便自動(dòng)將輸入法狀態(tài)改為半角。
1、窗體Activated 事件發(fā)生時(shí)。
2、Form_Keyup 事件,按下Ctrl + Space時(shí)。
3、Form_KeyUp 事件,按下Shift+Space時(shí),呵呵,這樣做似乎不太好。?
這樣做基本上就可以保證用戶輸入法狀態(tài)為半角了,不知是否還有疏漏呢?
至于將輸入法狀態(tài)改為半角,我們有相關(guān)的API可以調(diào)用。
為了使用方便,特將這些封裝到工具類中,現(xiàn)與大家分享。
{
// 聲明一些API函數(shù)
[DllImport("imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hwnd);
[DllImport("imm32.dll")]
public static extern bool ImmGetOpenStatus(IntPtr himc);
// 暫時(shí)沒(méi)有用到,覺(jué)得這個(gè)API似乎有問(wèn)題。
[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;
private Form mFrm;
public ControlTools(Form frm)
{
this.mFrm = frm;
} // 輸入法全角轉(zhuǎn)半角
public void FullToHalf()
{
this.mFrm.KeyPreview = true;
this.mFrm.Activated += new EventHandler(mFrm_Activated);
this.mFrm.KeyUp += new KeyEventHandler(mFrm_KeyUp);
}
private void mFrm_KeyUp(object sender, KeyEventArgs e)
{
if ((e.Control || e.Shift) && e.KeyCode == Keys.Space)
{
this.mFrm_Activated(null, null);
}
}
private void mFrm_Activated(object sender, EventArgs e)
{
try
{
IntPtr HIme = ImmGetContext(this.mFrm.Handle);
// 如果輸入法處于打開(kāi)狀態(tài)
if (!ImmGetOpenStatus(HIme))
{
return;
}
int iMode = 0;
int iSentence = 0;
// 檢索輸入法信息
bool bSuccess = ImmGetConversionStatus(HIme, ref iMode, ref iSentence);
if (bSuccess)
{
// 如果是全角,轉(zhuǎn)換成半角
if ((iMode & IME_CMODE_FULLSHAPE) > 0)
{
ImmSimulateHotKey(this.mFrm.Handle, IME_CHOTKEY_SHAPE_TOGGLE);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
} 與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的输入法——讨厌的全角的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据结构基础(17) --二叉查找树的
- 下一篇: Linux下的tree命令 --Lin