[分享]WPF 虚拟键盘

场景:用WPF做触屏的软件难免会需要用户输入的问题,至少是简单的数字,这个时候就免不了需要键盘输入。

思路:既然是虚拟键盘,那么我的目的就是模拟键盘输入即可。

1.模拟键盘输入

模拟键盘输入?那么肯定免不了调用Win32API了。所以查看下Win32API是否提供了键盘输入的功能,找到发送按键的函数:

  

[DllImport("user32.dll", EntryPoint = "PostMessageW")]

public static extern int PostMessage( int hwnd,int wMsg,int wParam,int lParam);

2.找到需要输入的控件:

[DllImport("user32.dll")]
public static extern int GetFocus();

3.找到当前窗体

[DllImport("user32.dll")]
public static extern int GetForegroundWindow();

[DllImport("user32.dll")]
public static extern int AttachThreadInput(int idAttach,int idAttachTo,int fAttach);

[DllImport("user32.dll")]
public static extern int GetWindowThreadProcessId(int hwnd, int lpdwProcessId);

关键代码:

(1)Win32API功能类:

   /// <summary>
    /// Win32接口功能类
    /// </summary>
    public static class Win32API
    {
        /// <summary>
        /// 键入
        /// </summary>
        public const int WM_KEYDOWN = 0x100;

        [DllImport("user32.dll", EntryPoint = "SendMessageW")]
        public static extern int SendMessage(
             int hwnd,
             int wMsg,
             int wParam,
             int lParam);
        [DllImport("user32.dll", EntryPoint = "PostMessageW")]
        public static extern int PostMessage(
             int hwnd,
             int wMsg,
             int wParam,
             int lParam);
        [DllImport("user32.dll")]
        public static extern int GetForegroundWindow();
        [DllImport("user32.dll")]
        public static extern IntPtr GetLastActivePopup(IntPtr hWnd);
        [DllImport("user32.dll")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
        [DllImport("user32.dll")]
        public static extern int GetFocus();
        [DllImport("user32.dll")]
        public static extern int AttachThreadInput(
             int idAttach,
             int idAttachTo,
             int fAttach);
        [DllImport("user32.dll")]
        public static extern int GetWindowThreadProcessId(
             int hwnd,
             int lpdwProcessId);
        [DllImport("kernel32.dll")]
        public static extern int GetCurrentThreadId();

        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();
    }

(2)发送按键实现

     /// <summary>
        /// 发送按键
        /// </summary>
        /// <param name="asiiCode">键盘ascii码</param>
        private void SendKey(byte asiiCode)
        {
            AttachThreadInput(true);
            int getFocus = Win32API.GetFocus();
            //向前台窗口发送按键消息
            Win32API.PostMessage(getFocus, Win32API.WM_KEYDOWN, asiiCode, 0);
            AttachThreadInput(false); //取消线程亲和的关联
        }
        /// <summary>
        /// 设置线程亲和,附到前台窗口所在线程,只有在线程内才可以获取线程内控件的焦点
        /// </summary>
        /// <param name="b">是否亲和</param>
        private void AttachThreadInput(bool b)
        {
            Win32API.AttachThreadInput(
                   Win32API.GetWindowThreadProcessId(
                   Win32API.GetForegroundWindow(), 0),
                   Win32API.GetCurrentThreadId(), Convert.ToInt32(b));
        }

(3)附上按键ascii码表:

4.时间关系就做个简单的吧:

欢迎指正,转载请注明出处http://www.cnblogs.com/xinwang/p/6143169.html

时间: 2024-08-02 11:04:01

[分享]WPF 虚拟键盘的相关文章

WPF 虚拟键盘

原文:WPF 虚拟键盘 之前做了一款WPF虚拟键盘,调用Win32的API,可以模拟键盘事件. 现将代码分享如下: 按键布局如下: <Button Name="CmdTlide" Focusable="False" Click="Button_Click" Style="{StaticResource InformButton}" VerticalContentAlignment="Top" Hori

WPF 禁用TextBox的触摸后自动弹出虚拟键盘

原文:WPF 禁用TextBox的触摸后自动弹出虚拟键盘 前言 & 问题 如下截图,TextBox,在触摸点击后,会自动弹出windows的虚拟键盘. 如何,禁用键盘的自动弹出? 调用虚拟键盘 通过调用TapTip.exe或者osk.exe,主动弹出虚拟键盘 详细调用可参考:c#调用windows虚拟键盘 如何禁用键盘的弹出 TextBox在触摸点击后,会自动弹出虚拟键盘,是因为在控件中作了封装. --TextBox中详细TabTip.exe封装看了会,没找到 处理方案:重写TextBox的方法

h5移动端常见虚拟键盘顶起底部导航栏解决办法

在h5移动端开发中相信很多朋友跟我一样都会遇到页面底部导航被虚拟键盘顶起的问题,自己在网上找到的解决办法拿出来与大家分享,有不完美之处还望见谅,有更好的解决办法可以贴出来大家一起互相学习!! var oHeight = $(document).height(); //浏览器当前的高度 // 浏览器窗口发生变化时判断 $(window).resize(function(){ if($(document).height() < oHeight){ $('footer').hide(); }else{

IOS系统下虚拟键盘遮挡文本框问题的解决

最近在项目中发现同样的代码在Android端微信网页中点击文本框唤出的虚拟键盘不会遮挡文本框,但是在IOS端的微信网页中点击文本框唤出的键盘却在大部分情况下会遮挡文本框 经过高人指点,这个问题终于解决了 下面说说解决办法: 主要代码 document.body.scrollTop = document.body.scrollHeight; 然后在文本框获取焦点的时候,可以定义一个计时器,一直执行上面的那句话 在文本框失去焦点的时候,就把之前的计时器清除掉即可 js写法: let interval

页面跳转 和虚拟键盘的自动隐藏

前提:起码要有两个视图控制器. 注意事项: 设置跳转的动画效果 UITextField输入时,虚拟键盘的位置设置(整体布局向上移动,虚拟键盘的自动隐藏) 实现的功能: A:在第一个页面跳转到第二个页面,然后第二个页面点击按钮,进行返回 B:在第一个页面有一个text控件,点击一个按钮,传递到第二个页面,然后显示到第二个 页面的label上面: 效果展示: 步骤: 1.新建两个类,然后勾选xib,在AppDelegate的实现文件把其中的一个视图加载进去 //新建一个视图控制器 MainViewC

〖Android〗简单隐藏Android虚拟键盘的方法

在Android使用 input 输入文本时,不期望出现虚拟键盘: 一般情况下,大家会把键盘给卸载,不过也有简单的方法: 就是下载一个 com.wparam.nullkeyboard (NullKeyboard): 在使用input命令前,把它设置成默认键盘即可: 下载链接: http://m.downloadatoz.com/apps/com.wparam.nullkeyboard,15672/download.html Google Play: https://play.google.com

手机端页面,隐藏虚拟键盘

原生js中没有方法来控制手机虚拟键盘的隐藏与显示,当输入框得到焦点时会自动弹出虚拟键盘,很多时候页面已经滚动到别处了,键盘应该隐藏了,可键盘还是没收回,这时候可用个变通的办法了隐藏键盘. 首先在页面增加一个input元素: <input type="text" class="input-null" id="input-null" readonly> css如下 .input_null { display: block; width:

隐藏ios虚拟键盘的几种方法

在iOS应用开发中,有三类视图对象会打开虚拟键盘,进行输入操作,但如何关闭虚拟键盘,却没有提供自动化的方法.这个需要我们自己去实现.这三类视图对象分别是UITextField,UITextView和UISearchBar. 这里介绍一下UITextField中关闭虚拟键盘的几种方法. (miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1753330 ) 第一种方法,使用它的委托UITextFieldDelegate中的方法textF

iOS—收起虚拟键盘的各种方法

本文章转自—http://justcoding.iteye.com/blog/1476171 使用虚拟键盘来输入资讯,是iOS的重要互动方式之一,虚拟键盘通常会自动出现在可以编辑的UITextField或是 UITextView 的编辑事件中,叫出键盘固然容易,但是要把它收起来,可就没有这么简单,之前在 UITextField 输入结束后的收起小键盘的方式一文中,介绍了如何在编辑完成之后收起虚拟键盘,但是如果您的元件并没有对应的事件可以让你收起虚拟键盘,那又该如何做?下列我们以类似的元件 UIT