Winform虚拟/模拟键盘

这篇具有很好参考价值的文章主要介绍了Winform虚拟/模拟键盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目需要在触摸屏上增加一个虚拟键盘。记录下过程中遇到的问题及解决方法。

1.模拟按键

网上找到如下3种方法

1)SendKeys.Send

测试单独的shift不好用,所以最终未采纳此方法

SendKeys.Send("^{E}");//shift+e
SendKeys.Send("{Enter}");

2)keybd_event

最终选择了这个方法,简单有效。

虚拟按键对照表:https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
public static uint KEYEVENTF_KEYDOWN = 0;// 键按下 KEYEVENTF_KEYDOWN = 0
public static uint KEYEVENTF_KEYUP = 2;//键弹起 KEYEVENTF_KEYUP = 2
keybd_event(0x14, 0, KEYEVENTF_KEYDOWN, 0); //键按下 KEYEVENTF_KEYDOWN = 0
keybd_event(0x14, 0, KEYEVENTF_KEYUP, 0); //键弹起 KEYEVENTF_KEYUP = 2

3)PostMessage

这个方法也是简单有效,但是据说有些其他问题,没有仔细研究,有兴趣的可以自己研究。

[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
public static extern int PostMessage(IntPtr hWnd, int Msg, Keys wParam, int lParam);

PostMessage(textBox2.Handle, 256, Keys.D, 2);//模拟按下2次 Keys.D

2.各种类型键的处理

微软对键盘输入有进行了分类,可以参考这个。

https://learn.microsoft.com/zh-cn/windows/win32/learnwin32/keyboard-input

1)CapsLock键/NumLock键

想要实现键盘按下抬起与界面效果相同,就需要捕获键盘操作。我使用了Hook

以下这篇博客写的很清晰明了,就不赘述了。

https://www.cnblogs.com/chorm590/p/14199978.html

在hook回调函数中做了如下处理

private int keyboardHookCallback(int code, IntPtr wParam, IntPtr lParam)
{
  if (code < 0)
    {
       return User32.CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
    }
   else
   {
     Keyboard_LL_Hook_Data khd = (Keyboard_LL_Hook_Data)Marshal.PtrToStructure(lParam, typeof(Keyboard_LL_Hook_Data));
      System.Diagnostics.Debug.WriteLine($"key event:{wParam}, key code:{khd.vkCode}, event time:{khd.time}");
      if ((int)wParam == 256 && khd.vkCode == 0x14)
      {
        IsCapsLockDown = !IsCapsLockDown;
      }
      return User32.CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
   }
}
private bool isCapsLockDown;
private bool IsCapsLockDown
{
  get { return isCapsLockDown; }
   set
    {
      isCapsLockDown = value;
       this.buttonCapsLock.BackColor = value ? Color.Gray : Control.DefaultBackColor;
    }
}
private void buttonCapsLock_Click(object sender, EventArgs e)
{
  User32.keybd_event(VirtualKeyCode.CAPS_LOCK, 0, 0, 0);   //键按下 KEYEVENTF_KEYDOWN = 0
   User32.keybd_event(VirtualKeyCode.CAPS_LOCK, 0, 2, 0);  //键弹起 KEYEVENTF_KEYUP = 2
}

初始化时同步键盘CapsLock/NumLock状态,使用user32.GetKeyState.返回值等于1则按下状态

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern short GetKeyState(int keyCode);
public static bool GetState(byte VKeyCode)
{
   return (User32.GetKeyState(VKeyCode) == 1);
}

2)其他组合键处理

ctrl+shift切换输入法,只响应这一种功能键+功能键。其他小伙伴有好的方法可以分享一下。

3)输入键+组合键

如ctrl+c,ctrl+v,ctrl+a,ctrl+z等等。

此方法不是最优方式,可以改进功能键存放在Queue中,遍历功能键,按顺序响应。

private void HandleKeysCombin(byte VKCode)
{
  //设置焦点控件
   this.ActiveControl = this.m_CustomActiveControl;
   lock (this)
   {
     if (IsCtrlDown)
      {
        keybd_event(VirtualKeyCode.CTRL, 0, KEYEVENTF_KEYDOWN, 0);                //键按下 KEYEVENTF_KEYDOWN = 0
      }
      if (IsShiftDown)
      {
        keybd_event(VirtualKeyCode.SHIFT, 0, KEYEVENTF_KEYDOWN, 0);                //键按下 KEYEVENTF_KEYDOWN = 0
      }
      if (IsAltDown)
      {
        keybd_event(VirtualKeyCode.ALT, 0, KEYEVENTF_KEYDOWN, 0);                //键按下 KEYEVENTF_KEYDOWN = 0
      }
      keybd_event(VKCode, VKCode, User32.KEYEVENTF_KEYDOWN, 0);                //键按下 KEYEVENTF_KEYDOWN = 0
      keybd_event(VKCode, VKCode, User32.KEYEVENTF_KEYUP, 0);           //键弹起 KEYEVENTF_KEYUP = 2
      if (IsCtrlDown)
      {
        keybd_event(VirtualKeyCode.CTRL, 0, KEYEVENTF_KEYUP, 0);                //键弹起 KEYEVENTF_KEYUP = 2
         IsCtrlDown = false;
      }
      if (IsShiftDown)
      {
        keybd_event(VirtualKeyCode.SHIFT, 0, KEYEVENTF_KEYUP, 0);              //键弹起 KEYEVENTF_KEYUP = 2
         IsShiftDown = false;
      }
      if (IsAltDown)
      {
         keybd_event(VirtualKeyCode.ALT, 0, KEYEVENTF_KEYUP, 0);                //键弹起 KEYEVENTF_KEYUP = 2
        IsAltDown = false;
     }
  }
}

3.窗体/UserControl焦点的处理

这篇里面方法简单好用,不赘述

 https://blog.csdn.net/accomp/article/details/7209052文章来源地址https://www.toymoban.com/news/detail-456196.html

到了这里,关于Winform虚拟/模拟键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F103C8T6+2.4寸SPI TFT触摸屏代码+标准库 项目开发

    目录 模块清单: 模块介绍: 1:STM32F103C8T6 2:2.4寸SPI TFT触摸屏 项目结果展示 2.4寸 TFT SPI显示触摸屏 2.4寸 SPI TFT 显示触摸屏代码下载链接: https://download.csdn.net/download/weixin_49492286/88458377 清单 STM32F103C8T6 2.4寸SPI TFT触摸屏         STM32F103C8T6是意法半导体(STMicroelectronics)推

    2024年02月07日
    浏览(65)
  • 应用在手机触摸屏中的电容式触摸芯片

    触控屏(Touch panel)又称为触控面板,是个可接收触头等输入讯号的感应式液晶显示装置,当接触了屏幕上的图形按钮时,屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置,可用以取代机械式的按钮面板,并借由液晶显示画面制造出生动的影音效果。 手机触摸

    2024年02月07日
    浏览(48)
  • 应用在游戏机触摸屏中的触摸感应芯片

    触屏游戏机的屏幕是由液晶屏和触控层组成的。触控层分为电容式触屏和电阻式触屏两种。电容式触屏是将悬空电极和屏幕玻璃上的电极组成静电场,当人体接近屏幕时,就会改变静电场分布,从而实现触摸的位置探测。而电阻式触屏则是利用玻璃上的两层电极之间通电形成一个

    2024年01月18日
    浏览(41)
  • LABVIEW 虚拟键盘 触摸键盘 中英文输入 支持WIN10 WIN7

       当labview打包后在工业触摸电脑上运行,一旦需要修改参数,便有一个头疼的问题:     1、要么接键盘鼠标,那么便失去了触屏的优势,设备或仪器结构也不够简洁美观;     2、要么使用系统自带虚拟键盘,键盘有时会盖住需要输入的地方,盲输键码,那个使用体验就不

    2024年02月10日
    浏览(39)
  • 基于GEC6818的触摸屏

    连接操作系统的输入设备,可不止一种,也许是一个标准PS/2键盘,也许是一个USB鼠标,或者是一块触摸屏,甚至是一个游戏机摇杆,Linux在处理这些纷繁各异的输入设备的时候,采用的办法还是找中间层来屏蔽各种细节,请看下图: 在Linux的内核中,对输入设备的使用,实际

    2024年02月05日
    浏览(53)
  • ESP32开发---驱动触摸屏

    采用 I2C 驱动触摸屏。 I2C 多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 它有两条线,一条是 SCL (串行时钟总线),另外一条是SDA(串行数据线),这两条数据需要接上拉电阻,总线空闲的时候SCL和SDA处于高电

    2024年02月08日
    浏览(52)
  • Linux 多点电容触摸屏实验

    1、多点触摸(MT)协议详解 电容触摸屏驱动其实就是以下几种 linux 驱动框架的组合: ①、IIC 设备驱动,因为电容触摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 设备驱动。 ②、通过中断引脚(INT)向 linux 内核上报触摸信息,因此需要用到 linux 中断驱动框架。坐标的上报在中断

    2024年02月06日
    浏览(51)
  • Linux 触摸屏 (IIC驱动详解)

    本文使用触摸屏iic驱动,驱动编写中要使用 总线,设备,驱动 分层的思想,IIC总线,触摸屏驱动,触摸屏设备,   一般 SOC 的 I2C 总线驱动都是由半导体厂商编写的,比如 I.MX6U 的 I2C 适配器驱动 NXP 已经编写好了,这个不需要用户去编写。因此 I2C 总线驱动对我们这些 SOC 使

    2023年04月11日
    浏览(53)
  • 电容触摸屏驱动(Linux驱动开发篇)

    电容屏只需要手指轻触即可,而电阻屏是需要手指 给予一定的压力才有反应,而且电容屏不需要校准。 如果要做人机交互设备的开发,多点电容触摸屏基本是不可能绕过去的。 正点原子ATK-7016 这款屏幕 其实是由 TFT LCD+触摸屏组合起来的。底下是 LCD 面板,上面是触摸面板,

    2024年02月05日
    浏览(65)
  • WPF --- 触摸屏下的两个问题

    本片文章分享一下之前遇到的WPF应用在触摸屏下使用时的两个问题。 具体场景就是一个配置界面, ScrollViewer 中包含一个 StackPanel 然后纵向堆叠,已滚动的方式查看,然后包含多个 TextBlock 、 TextBox 以及 DataGrid ,期间遇到了两个问题: WPF在触摸屏下,如果有滚动条( ScrollVie

    2024年03月09日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包