[分享]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, );
AttachThreadInput(false); //取消线程亲和的关联
}
/// <summary>
/// 设置线程亲和,附到前台窗口所在线程,只有在线程内才可以获取线程内控件的焦点
/// </summary>
/// <param name="b">是否亲和</param>
private void AttachThreadInput(bool b)
{
Win32API.AttachThreadInput(
Win32API.GetWindowThreadProcessId(
Win32API.GetForegroundWindow(), ),
Win32API.GetCurrentThreadId(), Convert.ToInt32(b));
}
(3)附上按键ascii码表:
4.时间关系就做个简单的吧:
欢迎指正,转载请注明出处http://www.cnblogs.com/xinwang/p/6143169.html
[分享]WPF 虚拟键盘的更多相关文章
- WPF 虚拟键盘
之前做了一款WPF虚拟键盘,调用Win32的API,可以模拟键盘事件. 现将代码分享如下: 按键布局如下: <Button Name="> <StackPanel Orie ...
- wpf 虚拟键盘 对外部程序
对外部程序,以记事本为例,xaml中设置模拟按键的控件 Focusable="False": /// <summary> /// 发送按键 /// </summa ...
- WPF 禁用TextBox的触摸后自动弹出虚拟键盘
前言 & 问题 如下截图,TextBox,在触摸点击后,会自动弹出windows的虚拟键盘. 如何,禁用键盘的自动弹出? 调用虚拟键盘 通过调用TapTip.exe或者osk.exe,主动弹出 ...
- h5移动端常见虚拟键盘顶起底部导航栏解决办法
在h5移动端开发中相信很多朋友跟我一样都会遇到页面底部导航被虚拟键盘顶起的问题,自己在网上找到的解决办法拿出来与大家分享,有不完美之处还望见谅,有更好的解决办法可以贴出来大家一起互相学习!! var ...
- Android开发案例 - 自定义虚拟键盘
所有包含IM功能的App(如微信, 微博, QQ, 支付宝等)都提供了Emoji表情之类的虚拟键盘, 如下图: 本文只着重介绍如何实现输入法键盘和自定义虚拟键盘的流畅切换, 而不介绍如何实现虚 ...
- Xamarin的不归路-安卓模拟器启动慢&没有虚拟键盘
1.启动慢解决方案:参考这篇文章进行配置 http://www.360doc.com/content/13/1002/18/532901_318605525.shtml 2.模拟器没有虚拟键盘解决方案 ...
- [原创]cocos2d-x研习录-第三阶 特性之按键与虚拟键盘
Cocos2D-x引擎支持按键事件,它能检测设备的键盘输入并处理相应的事件.而基于不同操作系统的移动设备,可供用户操作的按键数量和功能都存在差异. Cocos2D-x使用CCKeypadDeleg ...
- 039. asp.netWeb用户控件之七实现具有虚拟键盘的功能的用户控件
用户控件ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="K ...
- 关于Android 打开新的Activity 虚拟键盘的弹出与不弹出
关于Android 打开新的Activity 虚拟键盘的弹出与不弹出 打开Activity 时 在相应的情况 弹出虚拟键盘 或者 隐藏虚拟键盘 会给用户非常好的用户体验 , 实现起来也比较简单 只需 ...
随机推荐
- Android三种菜单简介
Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Menu).子菜单(Sub Menu). 一.选项菜单 用户点击设备上的菜单按钮(Menu),触发事件 ...
- C#快速导入海量XML数据至SQL Server数据库
#region 将Xml中的数据读到Dataset中,然后用SqlBulkCopy类把数据copy到目的表中using (XmlTextReader xmlReader = new XmlTextRe ...
- 一个小白对Arguments的理解
1.Arguments是一个类似数组的实参队列,译为:论据,论点,姑且译作参数(实参): 2.Arguments与形参保持不同的存储空间,只有当形参被赋值之后两者才会相等 3.传说在严格模式下函数内自 ...
- HTML5有语义的内联元素详解
HTML5有语义的内联元素详解 time标签 time 元素表示一个时间值,比如 5:35 P.M., EST, April 23, 2007.例如: Example Source Code:< ...
- php报警:Strict Standards: Only variables should be passed by reference in
错误原因 因为end函数的原因. end函数: mixed end ( array &$array ) 你可以看到end的参数是一个引用(reference),而你只能把一个变量的引 ...
- Android中的Selector的用法
转自: Android中的Selector主要是用来改变ListView和Button控件的默认背景.其使用方法可以按一下步骤来设计: (以在mylist_view.xml为例) 1.创建mylist ...
- Lambda表达式中的表达式lambda和语句lambda区别
Lambda表达式可分为表达式lambda和语句lambda 表达式lambda:表达式位于 => 运算符右侧的lambda表达式称为表达式lambda (input parameters) = ...
- ETL控件学习之一从数据库导出数据到平面
今天主要进行ETL控件的学习.主要是使用微软的SSDT工具.使用DataFlowTask 将数据源导出到目标文件的方式. 1.打开SSDT新建一个SSIS的project,如下图所示: 2.在SSIS ...
- 求解:远程方法调用失败Exception from HRESULT: 0x800706BE)
服务器:Windows Server2003 sp2服务器 客户端:XP SP3 内容:C#Winform客户端调用服务器的Excel模板生成报表的时候,生成失败,抛出的异常如下: TargetInv ...
- mapreduce (五) MapReduce实现倒排索引 修改版 combiner是把同一个机器上的多个map的结果先聚合一次
(总感觉上一篇的实现有问题)http://www.cnblogs.com/i80386/p/3444726.html combiner是把同一个机器上的多个map的结果先聚合一次现重新实现一个: 思路 ...