前段时间研究过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
{
///
/// 获取系统所有的输入法,并可以程序改变当前输入法;打开关闭软键盘。
/// 程序:房客
/// QQ:83849123
/// Blog:http://www.cnblogs.com/sxlfybb
///
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 { 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); }
