前段时间研究过API,后来由于工作关系就没有再玩C#,而别说API了。今天晚上正好加班,等其他部门出活等到凌晨一点多了,还没有动静。就趁机耍一耍了,正好学习一下VS2005。 
  以前曾经见别人CSDN上面问过如何用程序打开软键盘,我也关注过,可没有结果。在网上搜了一下也没有能找出满意的答案。今天就拿这个开开刀吧,反正大项目也没有,只是一个小功能。结果没曾想,弄出来了。也有好久没有更新我的这一亩三分田了,就放上来了。    
  献给那些为中国共享软件和提高中国程序水平作努力的人们。    
  注:程序是在VS2005里面,注意一下。控件需要自己添加了。一个ComboBox,一个Textbox,一个Button,直接拖进去没有更改name    
  以下程序开始 
  ==================================    
  using System; 
  using System.Collections.Generic; 
  using System.ComponentModel; 
  using System.Data; 
  using System.Drawing; 
  using System.Text; 
  using System.Windows.Forms; 
  using System.Runtime.InteropServices;    
  namespace InputLanguageSwitch 
  { 
   /// <summary> 
   /// 获取系统所有的输入法,并可以程序改变当前输入法;打开关闭软键盘。 
   /// 程序:房客 
   /// QQ:83849123 
   /// Blog:http://www.cnblogs.com/sxlfybb 
   /// </summary> 
   public partial class Form1 : Form 
   { 
   public Form1() 
   { 
   InitializeComponent(); 
   this.InputLanguageChanged += new InputLanguageChangedEventHandler(Form1_InputLanguageChanged); 
   }    
   void Form1_InputLanguageChanged(object sender, InputLanguageChangedEventArgs e) 
   { 
   //throw new Exception("The method or operation is not implemented."); 
   for( int i=0;i<comboBox1.Items.Count;i++) 
   { 
   if (InputLanguage.CurrentInputLanguage.LayoutName == comboBox1.Items[i].ToString()) 
   { 
   comboBox1.SelectedIndex = i; 
   }    
   } 
   }    
   private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
   { 
   string strTemp = comboBox1.Items[comboBox1.SelectedIndex].ToString(); 
   InputLanguageCollection collects = InputLanguage.InstalledInputLanguages; 
   for (int i = 0; i < collects.Count; i++) 
   { 
   if (collects[i].LayoutName == strTemp) 
   InputLanguage.CurrentInputLanguage = collects[i]; 
   }    
   }    
   private void Form1_Load(object sender, EventArgs e) 
   { 
   InputLanguageCollection collects = InputLanguage.InstalledInputLanguages; 
   for (int i = 0; i < collects.Count; i++) 
   { 
   comboBox1.Items.Add(collects[i].LayoutName); 
   } 
   comboBox1.SelectedIndex = collects.IndexOf(InputLanguage.CurrentInputLanguage); 
   }    
   private void button1_Click(object sender, EventArgs e) 
   { 
   this.textBox1.Focus(); 
   IntPtr hwndInput = ImmGetContext(this.Handle); 
   IntPtr dw1 = IntPtr.Zero; 
   IntPtr dw2 = IntPtr.Zero; 
   bool isSuccess = ImmGetConversionStatus(hwndInput, ref dw1, ref dw2); 
   if (isSuccess) 
   { 
   int intTemp = dw1.ToInt32() & IME_CMODE_SOFTKBD; 
   if (intTemp > 0) 
   dw1 = (IntPtr)(dw1.ToInt32() ^ IME_CMODE_SOFTKBD); 
   else 
   dw1 = (IntPtr)(dw1.ToInt32() IME_CMODE_SOFTKBD); 
   } 
   isSuccess = ImmSetConversionStatus(hwndInput, dw1, dw2); 
   ImmReleaseContext(this.Handle, hwndInput); 
   }    
   public const int IME_CMODE_SOFTKBD = 0x80;    
   [DllImport("imm32.dll", EntryPoint = "ImmGetContext")] 
   public static extern IntPtr ImmGetContext( 
   IntPtr hwnd 
   ); 
   [DllImport("imm32.dll", EntryPoint = "ImmGetConversionStatus")] 
   public static extern bool ImmGetConversionStatus( 
   IntPtr himc, 
   ref IntPtr lpdw, 
   ref IntPtr lpdw2 
   ); 
   [DllImport("imm32.dll", EntryPoint = "ImmSetConversionStatus")] 
   public static extern bool ImmSetConversionStatus( 
   IntPtr himc, 
   IntPtr dw1, 
   IntPtr dw2 
   );    
   [DllImport("imm32.dll", EntryPoint = "ImmReleaseContext")] 
   public static extern int ImmReleaseContext( 
   IntPtr hwnd, 
   IntPtr himc 
   );    
   } 
  }    
  ============================== 
  代码结束。 
  另外,也可以直接执行OSK而直接打开虚拟键盘,不过这个和软键盘是不一样的。 
  现在反钓鱼的软件越来越多了,祝大家共同进步。    
  谢谢大家的支持,昨天晚上发的,到现在已经有好几个人加我问我了,为了方便大家,我把源程序一并也发在附件里,以供大家下载参考。    
  点击下载
http://cisco.chinaitlab.com/InputLanguageSwitch.rar
查看本文来源