WPF 虚拟键盘
之前做了一款WPF虚拟键盘,调用Win32的API,可以模拟键盘事件。
现将代码分享如下:
按键布局如下:
<Button Name="CmdTlide" Focusable="False" Click="Button_Click" Style="{StaticResource InformButton}" VerticalContentAlignment="Top" HorizontalContentAlignment="Left" Width="" Height="">
<StackPanel Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Top" >
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Top" ><Run Text="~"/></TextBlock>
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom" ><Run Text="'"/></TextBlock>
</StackPanel>
</Button>
点击事件:
private void Button_Click(object sender, RoutedEventArgs e)
{
System.Windows.Controls.Button keybtn = sender as System.Windows.Controls.Button;
#region//First Row
if (keybtn.Name == "CmdTlide")
{
addNumkeyINput(0xc0);
}
else if (keybtn.Name == "cmd1")
{
addNumkeyINput(0x31);
}
else if (keybtn.Name == "cmd2")
{
addNumkeyINput(0x32);
}
else if (keybtn.Name == "cmd3")
{
addNumkeyINput(0x33);
}
else if (keybtn.Name == "cmd4")
{
addNumkeyINput(0x34);
}
else if (keybtn.Name == "cmd5")
{
addNumkeyINput(0x35);
}
else if (keybtn.Name == "cmd6")
{
addNumkeyINput(0x36); }
else if (keybtn.Name == "cmd7")
{
addNumkeyINput(0x37);
}
else if (keybtn.Name == "cmd8")
{
addNumkeyINput(0x38);
}
else if (keybtn.Name == "cmd9")
{
addNumkeyINput(0x39);
}
else if (keybtn.Name == "cmd0")
{
addNumkeyINput(0x30); }
else if (keybtn.Name == "cmdminus")//-_
{
addNumkeyINput(0xbd);
}
else if (keybtn.Name == "cmd1")//+=
{
addNumkeyINput(0xbb);
}
else if (keybtn.Name == "cmdBackspace")//backspace
{
AddKeyBoardINput(0x08);
}
#endregion
#region//Second Row
else if (keybtn.Name == "CmdTab")
{
AddKeyBoardINput(0x09);
}
else if (keybtn.Name == "CmdQ")
{
AddKeyBoardINput(0x51);
}
else if (keybtn.Name == "Cmdw")
{
AddKeyBoardINput(0x57); }
else if (keybtn.Name == "CmdE")
{
AddKeyBoardINput(0X45); }
else if (keybtn.Name == "CmdR")
{
AddKeyBoardINput(0X52); }
else if (keybtn.Name == "CmdT")
{
AddKeyBoardINput(0X54); }
else if (keybtn.Name == "CmdY")
{
AddKeyBoardINput(0X59); }
else if (keybtn.Name == "CmdU")
{
AddKeyBoardINput(0X55); }
else if (keybtn.Name == "CmdI")
{
AddKeyBoardINput(0X49); }
else if (keybtn.Name == "CmdO")
{
AddKeyBoardINput(0X4F);
}
else if (keybtn.Name == "CmdP")
{
AddKeyBoardINput(0X50);
}
else if (keybtn.Name == "CmdOpenCrulyBrace")
{
addNumkeyINput(0xdb);
}
else if (keybtn.Name == "CmdEndCrultBrace")
{
addNumkeyINput(0xdd);
}
else if (keybtn.Name == "CmdOR")
{
addNumkeyINput(0xdc);
}
#endregion
#region///Third ROw else if (keybtn.Name == "CmdCapsLock")//caps lock
{
AddKeyBoardINput(0x14);
if (checkImage.Visibility != Visibility.Visible)
{
checkImage.Visibility = Visibility.Visible;
}
else
{
checkImage.Visibility = Visibility.Hidden;
}
}
else if (keybtn.Name == "CmdA")
{
AddKeyBoardINput(0x41);
}
else if (keybtn.Name == "CmdS")
{
AddKeyBoardINput(0x53);
}
else if (keybtn.Name == "CmdD")
{
AddKeyBoardINput(0x44);
}
else if (keybtn.Name == "CmdF")
{
AddKeyBoardINput(0x46);
}
else if (keybtn.Name == "CmdG")
{
AddKeyBoardINput(0x47);
}
else if (keybtn.Name == "CmdH")
{
AddKeyBoardINput(0x48);
}
else if (keybtn.Name == "CmdJ")
{
AddKeyBoardINput(0x4A);
}
else if (keybtn.Name == "CmdK")
{
AddKeyBoardINput(0X4B);
}
else if (keybtn.Name == "CmdL")
{
AddKeyBoardINput(0X4C); }
else if (keybtn.Name == "CmdColon")//;:
{
addNumkeyINput(0xba);
}
else if (keybtn.Name == "CmdDoubleInvertedComma")//'"
{
addNumkeyINput(0xde);
}
else if (keybtn.Name == "CmdEnter")
{
AddKeyBoardINput(0x0d);
}
#endregion
#region//Fourth Row
else if (keybtn.Name == "CmdShift" || keybtn.Name == "CmdlShift")
{
if (CtrlFlag)
{
CtrlFlag = false;
ShiftFlag = false;
changeInput();
}
else
{
ShiftFlag = true;
}
}
else if (keybtn.Name == "CmdZ")
{ AddKeyBoardINput(0X5A); }
else if (keybtn.Name == "CmdX")
{
AddKeyBoardINput(0X58); }
else if (keybtn.Name == "CmdC")
{
AddKeyBoardINput(0X43); }
else if (keybtn.Name == "CmdV")
{
AddKeyBoardINput(0X56); }
else if (keybtn.Name == "CmdB")
{
AddKeyBoardINput(0X42); }
else if (keybtn.Name == "CmdN")
{
AddKeyBoardINput(0x4E); }
else if (keybtn.Name == "CmdM")
{
AddKeyBoardINput(0x4D);
}
else if (keybtn.Name == "CmdLessThan")//<,
{
addNumkeyINput(0xbc);
}
else if (keybtn.Name == "CmdGreaterThan")//>.
{
addNumkeyINput(0xbe);
}
else if (keybtn.Name == "CmdQuestion")//?/
{
addNumkeyINput(0xbf);
} else if (keybtn.Name == "CmdSpaceBar")
{
AddKeyBoardINput(0x20);
}
#endregion
#region//Last row
else if (keybtn.Name == "CmdCtrl" || keybtn.Name == "CmdlCtrl")//ctrl
{
if (ShiftFlag)
{
ShiftFlag = false;
CtrlFlag = false;
}
else
{
CtrlFlag = true;
}
//AddKeyBoardINput(0x11);
}
else if (keybtn.Name == "CmdpageUp")
{
AddKeyBoardINput(0x21);
}
else if (keybtn.Name == "CmdpageDown")
{
AddKeyBoardINput(0x22);
}
else if (keybtn.Name == "CmdClose")//关闭键盘
{
//this.Opacity = 0;
// this.Close();
// this.keyboard.Visibility = Visibility.Hidden;
//this.keyboard.Focusable = false; System.Windows.Application.Current.Shutdown();
}
#endregion
}
触发键盘事件:
private static void addNumkeyINput(byte input)
{
if (CtrlFlag)
{
CtrlFlag = false;
ShiftFlag = false;
keybd_event(input, , , );
keybd_event(input, , 0x02, );
}
else
{
if (!ShiftFlag)
{
keybd_event(input, , , );
keybd_event(input, , 0x02, );
}
else
{
keybd_event(0x10, , , );//shift
keybd_event(input, , , );
keybd_event(input, , 0x02, );
keybd_event(0x10, , 0x02, ); ShiftFlag = false;
}
}
}
WPF 虚拟键盘的更多相关文章
- [分享]WPF 虚拟键盘
场景:用WPF做触屏的软件难免会需要用户输入的问题,至少是简单的数字,这个时候就免不了需要键盘输入. 思路:既然是虚拟键盘,那么我的目的就是模拟键盘输入即可. 1.模拟键盘输入 模拟键盘输入?那么肯定 ...
- wpf 虚拟键盘 对外部程序
对外部程序,以记事本为例,xaml中设置模拟按键的控件 Focusable="False": /// <summary> /// 发送按键 /// </summa ...
- WPF 禁用TextBox的触摸后自动弹出虚拟键盘
前言 & 问题 如下截图,TextBox,在触摸点击后,会自动弹出windows的虚拟键盘. 如何,禁用键盘的自动弹出? 调用虚拟键盘 通过调用TapTip.exe或者osk.exe,主动弹出 ...
- 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 时 在相应的情况 弹出虚拟键盘 或者 隐藏虚拟键盘 会给用户非常好的用户体验 , 实现起来也比较简单 只需 ...
- JS虚拟键盘
由于是触摸屏,所以需要一款JS虚拟键盘.上网找了一个好用的VirtualKeyboard,作了修改. 修改该插件参考的博客文章:http://www.cnblogs.com/xinggong/arch ...
随机推荐
- C#GridViewExport帮助类,美化导出
1.将整GridView的数据导出到Excel中关增加一个效果线做美化 最新的GridViewExport操作类 using System.Data; using System.Web; using ...
- JavaScript笔记基础篇(一)
一. 常用正则表达式汇总以及部分问题解决方案 正则匹配: var str = "This is my test"; var test = new RegExp("test ...
- JS和CSS关于大小写的区分
方法: document.getElementById("xx").style.xxx中的所有属性是什么 盒子标签和属性对照 CSS语法(不区分大小写) JavaScript语法( ...
- nodejs将PDF文件转换成txt文本,并利用python处理转换后的文本文件
目前公司Web服务端的开发是用Nodejs,所以开发功能的话首先使用Nodejs,这也是为什么不直接用python转换的原因. 由于node对文本的处理(提取所需信息)的能力不强,类似于npm上的包: ...
- Qlikview 处理增量数据的脚本
一般设计Qlikview报表的时候需要些2个脚本文件,一个针对Qlikview的Server job 导出数据到qvd数据文具. 另一个用户访问的Qlikview的脚本是直接展示qvd文件的数据. 事 ...
- ASP.NET Web API之消息[拦截]处理
标题相当难取,内容也许和您想的不一样,而且网上已经有很多这方面的资料了,我不过是在实践过程中作下记录.废话少说,直接开始. Exception 当服务端抛出未处理异常时,most exceptions ...
- primefaces 知识点整理
database组件中设置数据中一行的颜色 需要设置属性: rowStyleClass="#{data.tradeMoney le 0 ? 'exp' : null}"exp样式: ...
- Redis的主从同步复制
先来看一下Redis的主从同步复制的原理: 在Slave启动并连接到Master之后,它将主动发送一条SYNC命令.此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台 ...
- nc检测端口是否正常服务的一个命令
最近碰到一个项目,前端用apache htttpd进行发布(80端口),通过双机负载均衡转发到后端的两个tomcat进行处理(8081和8082端口),现在需要随时监控这三个端口的情况,一旦down掉 ...
- hdu 3667 拆边加最小费用流
Transportation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...