前段时间研究过API,后来由于工作关系就没有再玩C#,而别说API了。今天晚上正好加班,等其他部门出活等到凌晨一点多了,还没有动静。就趁机耍一耍了,正好学习一下VS2005。
以前曾经见别人CS上面问过如何用程序打开软键盘,我也关注过,可没有结果。在网上搜了一下也没有能找出满意的答案。今天就拿这个开开刀吧,反正大项目也没有,只是一个小功能。结果没曾想,弄出来了。也有好久没有更新我的这一亩三分田了,就放上来了。

献给那些为中国共享软件和提高中国程序水平作努力的人们。

注:程序是在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>
     /// 获取系统所有的输入法,并可以程序改变当前输入法;打开关闭软键盘。
     /// 程序:房客 
     /// </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
         );    }
 }