• C#用代码打开软键盘


    前段时间研究过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而直接打开虚拟键盘,不过这个和软键盘是不一样的。
    现在反钓鱼的软件越来越多了,祝大家共同进步。

    谢谢大家的支持,昨天晚上发的,到现在已经有好几个人加我问我了,为了方便大家,我把源程序一并也发在附件里,以供大家下载参考。

    点击下载

  • 相关阅读:
    C#神奇的扩展方法
    OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用
    xslt格式化日期的方法
    c# 对象存cookie
    Oracle Client安装报错:引用数据不可用于验证此操作系统分发的先决条件
    Web.config中设置启用webservice远程调试访问 参数看不到
    ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
    IIS无法加载字体文件(*.woff,*.svg)的解决办法
    word 里面没输入法
    photoshop cc 2018破解补丁(pscc2018注册机) 附使用方法
  • 原文地址:https://www.cnblogs.com/sxlfybb/p/408519.html
Copyright © 2020-2023  润新知