科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道VS2005中C#用代码打开软键盘

VS2005中C#用代码打开软键盘

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

前段时间研究过API,后来由于工作关系就没有再玩C#,而别说API了。今天晚上正好加班,等其他部门出活等到凌晨一点多了,还没有动静。

作者:中国IT实验室 来源:中国IT实验室 2007年9月8日

关键字: C# VS2005

  • 评论
  • 分享微博
  • 分享邮件
    前段时间研究过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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章