原文:示例:WPF仿制OSK做的系统键盘和数字键盘

一、目的:在应用osk.exe系统键盘时遇到很多不方便,比如有些系统调用不出来等问题,由此开发了一个系统键盘仿制osk

二、实现功能

1、目前实现大部分osk键盘的输入功能,还有部分按键由于时间关系没有实现

2、支持组合按键shift、ctrl、alt等方式输入

3、支持大小写输入切换

4、支持shift切换复合按键

5、支持在外部记事本、网页等有光标的位置进行输入

三、示意图

系统键盘部分:

数字键盘部分:

四、实现部分

1、采用模拟虚拟按键方式输入按键


  1. public static partial class KeyHelper
  2. {
  3. [DllImport("user32.dll", EntryPoint = "keybd_event")]
  4. public static extern void keybd_event(
  5. byte bVk, //虚拟键值
  6. byte bScan,// 一般为0
  7. int dwFlags, //这里是整数类型 0 为按下,2为释放
  8. int dwExtraInfo //这里是整数类型 一般情况下设成为0
  9. );
  10. [DllImport("user32.dll")]
  11. public static extern int GetFocus();
  12. }

2、通过禁用窗体获取焦点方式来进行外部输入,如记事本


  1. private void KeyBoardWindow_Loaded(object sender, RoutedEventArgs e)
  2. {
  3. WindowInteropHelper windowInteropHelper = new WindowInteropHelper(this);
  4. IntPtr intPtr = windowInteropHelper.Handle;
  5. int value = -20;
  6. SetWindowLong(intPtr, value, (IntPtr)0x8000000);
  7. }

  1. [DllImport("user32.dll")]
  2. public static extern int SetWindowLong(IntPtr hWnd, int nindex, IntPtr dwNewLong);
  3. [DllImport("user32.dll", SetLastError = true)]
  4. public static extern UInt32 GetWindowLong(IntPtr hWnd, int index);

五、待实现部分

目前Capslock、ctrl、shift、alt的按下状态和按键状态没有和外部硬件键盘做同步、后续会应用钩子检测同步外部硬件键盘状态

有些按键如win、fn、~等按键存在问题后续更新

六、代码下载

https://github.com/HeBianGu/WPF-SystemKeyboard.git

示例:WPF仿制OSK做的系统键盘和数字键盘的更多相关文章

  1. 关于Edittext默认弹出软键盘为数字键

    如果说我们只是输入数字的话,我们可以直接在xml文件中: android:inputType="number" 如果是身份证类型的话,我们可以这样: android:inputTy ...

  2. 「雕爷学编程」Arduino动手做(26)——4X4矩阵键盘模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  3. 单片机系统与标准PC键盘的接口模块设计

    转自单片机系统与标准PC键盘的接口模块设计 概述     在单片机系统中,当输入按键较多时,在硬件设计和软件编程之间总存在着矛盾.对于不同的单片机系统需要进行专用的键盘硬件设计和编程调试,通用性差,使 ...

  4. 给服务器做pve系统(可以通过web管理物理机集群资源与虚拟机)

    做此系统前,可以先进入bios,设置一下ipmi的网络地址.可以远程管理服务器 输入服务器的ipmi里面配置的ip 默认账号与密码admin 点击launch 会自动下载认证文件 下载好java软件环 ...

  5. 做考试系统用到的关于onbeforeunload一些兼容性问题

    最近做考试系统,一些效果存在一些兼容性问题,尤其是ie6,本人js不是很好,通过查资料解决了这些问题,现总结下: 关于onbeforeunload问题: 考试时离开页面需要提示,但是直接用此方法或on ...

  6. Android StatusBarUtil:设置Android系统下方虚拟键键盘透明度

     Android StatusBarUtil:设置Android系统下方虚拟键键盘透明度 Android StatusBarUtil是github上的一个开源项目,主页:https://githu ...

  7. WPF应用最小化至系统托盘运行

    原文:WPF应用最小化至系统托盘运行 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/5178889 ...

  8. wpf 复制/剪切到本地系统剪切板中以供右键粘贴用

    原文:wpf 复制/剪切到本地系统剪切板中以供右键粘贴用   http://www.cnblogs.com/yhdkzy/archive/2012/11/27/2790655.html   /// & ...

  9. iOS 系统数字键盘左下角加确定按钮

    首先在 viewWillAppear 方法中注册监听相应的键盘通知,并且要在 viewWillDisappear 方法中注销通知- (void)viewWillAppear:(BOOL)animate ...

随机推荐

  1. mysql日期存储格式int,timestarmp,datetime

    int (1).4个字节存储,INT的长度是4个字节,存储空间上比datatime少,int索引存储空间也相对较小,排序和查询效率相对较高一点点 (2)可读性极差,无法直观的看到数据. TIMESTA ...

  2. PHP 多图上传,图片批量上传插件,webuploader.js,百度文件上传插件

    PHP  多图上传,图片批量上传插件,webuploader.js,百度文件上传插件(案例教程) WebUploader作用:http://fex.baidu.com/webuploader/gett ...

  3. MySQL数据库(一)-- 数据库介绍、MySQL安装、基础SQL语句

    一.数据库介绍 1.什么是数据库 数据库即存储数据的仓库 2.为什么要用数据库 (1)用文件存储是和硬盘打交道,是IO操作,所以有效率问题 (2)管理不方便 (3)一个程序不太可能仅运行在同一台电脑上 ...

  4. django迁移脚本

    执行migrate报错的解决办法: 想知道migrate为什么报错,需要先了解migrate到底做了什么事情 migrate做了什么事情? 1.将相关的迁移脚本翻译成sql语句,然后在数据库中执行 2 ...

  5. Centos 7 解决free -m 下buff/cache缓存很高

    Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理中 ...

  6. ansible自动化运维01

    ansible是基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能.ansible ...

  7. Ningx的基本使用

    Ningx的基本使用   user www; worker_processes 2; error_log logs/error.log info; pid logs/nginx.pid;   even ...

  8. QElapsedTimer定时器记录程序执行时间

    QElapedTimer类提供了一种快速计算运行时间的方法,从Qt4.7引入. QElapsedTimer类通常用于快速计算两个事件之间经过了多少时间.它的API与QTime相似,因此可以将正在使用的 ...

  9. Python面试题(1)

    1.如何反向迭代一个序列 #如果是一个list,最快的方法使用reversetempList = [1,2,3,4]tempList.reverse()for x in tempList:    pr ...

  10. JAVA并发-join

    概念 join方法,一种特殊的wait,当前运行线程调用另一个线程的join方法,当前线程进入阻塞状态直到调用join方法的线程结束,再继续执行. 一般情况下,都是主线程创建一个子线程,子线程调用jo ...