winform 完成掌握輸出法。本站提示廣大學習愛好者:(winform 完成掌握輸出法)文章只能為提供參考,不一定能成為您想要的結果。以下是winform 完成掌握輸出法正文
這裡文章寫出來其實不是為了誇耀甚麼,只是認為發明些好器械就分享出來罷了,同時也做個記載,便利今後查找
開端注釋
1、先引見本文會用到的windows的API,網上有很具體的材料,我這裡就只扼要解釋一下
ImmGetContext(IntPtr hwnd):獲得以後正在輸出的窗口的輸出法句柄
ImmSetOpenStatus(IntPtr himc, bool b):設置輸出法的狀況
InputLanguage類:供給辦法和字段以治理輸出說話;這是winform外面自帶的輸出法治理類,msdn上有具體材料
2、好比本體系裝置有兩個輸出法:搜狗拼音 和 智能 ABC(留意:智能 ABC中央有個空格,用下劃線就是要明白比較出來)。
3、應用InputLanguage類來顯示指定的輸出法。
思緒很簡略:先獲得到操作體系中裝置的一切輸出法列表,然後輪回列表,比對指定的輸出法稱號(稱號可以設置在設置裝備擺設文件中,裝置的時刻,依據分歧人的須要設置裝備擺設成分歧的輸出法),然後把找到的輸出法設為以後輸出法,代碼以下:
//設置“搜狗拼音”為以後輸出法
foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
{
if (item.LayoutName.Contains("搜狗拼音"))
{
InputLanguage.CurrentInputLanguage = item;
break;
}
}
//設置“智能 ABC”為以後輸出法
foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
{
if (item.LayoutName.Contains("智能 ABC"))
{
InputLanguage.CurrentInputLanguage = item;
break;
}
}
//設置體系默許輸出法為以後輸出法
InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
3、處理輸出法被禁用的假象。
思緒也很簡略,只須要從新激活輸出法就好了,這裡就用到下面的API辦法了。
起首聲明一個拜托:
private delegate void fixImeDele();
private fixImeDele _fixime;
然後界說拜托要完成的工作。
fixime = delegate
{
IntPtr HIme = ImmGetContext(this.Handle);
ImmSetOpenStatus(HIme, true);
};
最初履行拜托就好了哦。
this.BeginInvoke(fixime);
最初完全代碼以下:
public partial class Form1 : Form
{
[DllImport("imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hwnd);//獲得以後正在輸出的窗口的輸出法句柄
[DllImport("imm32.dll")]
public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);//設置輸出法的狀況
private delegate void fixImeDele();
private fixImeDele fixime;
public Form1()
{
InitializeComponent();
}
private void txt搜狗拼音_Enter(object sender, EventArgs e)
{
//int index = InputLanguage.InstalledInputLanguages.IndexOf(InputLanguage.CurrentInputLanguage);
//設置“搜狗拼音”為以後輸出法
foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
{
if (item.LayoutName.Contains("搜狗拼音"))
{
InputLanguage.CurrentInputLanguage = item;
break;
}
}
}
private void textBox3_Enter(object sender, EventArgs e)
{
//設置“智能 ABC”為以後輸出法
foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
{
if (item.LayoutName.Contains("智能 ABC"))
{
InputLanguage.CurrentInputLanguage = item;
break;
}
}
}
private void txt體系默許_Enter(object sender, EventArgs e)
{
//設置體系默許輸出法為以後輸出法
InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
}
private void txtTrue_Enter(object sender, EventArgs e)
{
fixime = delegate
{
IntPtr HIme = ImmGetContext(this.Handle);
ImmSetOpenStatus(HIme, true);
};
this.BeginInvoke(fixime);
}
private void txtFalse_Enter(object sender, EventArgs e)
{
fixime = delegate
{
IntPtr HIme = ImmGetContext(this.Handle);
ImmSetOpenStatus(HIme, false);
};
this.BeginInvoke(fixime);
}
}
再給年夜家分享一個小成績的處理辦法
wihform 默許的 ImeMode 值是NoControl
這不合適中文輸出.
由於例如: 你每到一個控件都要切換一下輸出法.
我們應當把父窗口 及一切子窗口 的 ImeMode 值 設置為 On
可是如許有個成績就是 它老是全角狀況.
處理方法是:
在每一個窗休的 Desinger.cs文件裡找到
this.ImeMode = System.Windows.Forms.ImeMode.On;
調換為
this.ImeMode = System.Windows.Forms.ImeMode.OnHalf;
如許就ok了.