zoukankan      html  css  js  c++  java
  • C#获取,设置键盘Num,Caps,Scroll键状态

    以前使用的显示终端设备,没有配备大键盘,只有一个数字小键盘,是用来输密码的。以后客户有需求,需要控制屏幕提示信息的显示,敏感信息他们想显示的时候就显示,不想显示的时候就显示默认信息。由于软件界面是全屏的,也不能给客户配个鼠标在界面上加上菜单,让他们去点。我就利用了数字小键盘上的Num Lock键,灯亮的时候就是显示信息,他们不想显示的时候就把数字小键盘上的NUM灯按灭,这样也很直观,方便。要达到这一效果首先要能获取Num Lock键的状态,还要能控制Num Lock键的亮灭。

    我用C#实现,因为要调用API, 首先引用using System.Runtime.InteropServices;

    然后是声明:

       1: /// <summary>
       2: /// 获取键状态
       3: /// </summary>
       4: /// <param name="keyCode"></param>
       5: /// <returns></returns>
       6: [DllImport("user32.dll",CharSet = CharSet.Auto,
       7:     ExactSpelling = true,
       8:     CallingConvention = CallingConvention.Winapi)]
       9: public static extern short GetKeyState(int keyCode);
      10:  
      11:  
      12: /// <summary>
      13: /// 改变键状态
      14: /// </summary>
      15: /// <param name="bVk"></param>
      16: /// <param name="bScan"></param>
      17: /// <param name="dwFlags"></param>
      18: /// <param name="dwExtraInfo"></param>
      19: [DllImport("user32.dll")]
      20: static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

    由于键盘上的Caps Lock和Scroll Lock和Num Lock类型是一样的,就把其它两个键一起说了,省了用到了再去乱找。三个键的常量声明:

       1: //按键状态
       2: const int KEYEVENTF_EXTENDEDKEY = 0x1;
       3: const int KEYEVENTF_KEYUP = 0x2;
       4:  
       5: //键值
       6: const int VK_NUMLOCK = 0x90;
       7: const int VK_CAPITAL=0x14;
       8: const int VK_SCROLL = 0x91;

    获取键状态和设置键状态:

       1: //获取键状态
       2: bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
       3: bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
       4: bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
       1: //设置NUM Lock
       2: private void btnNum_Click(object sender, EventArgs e)
       3: { 
       4:     keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
       5:     keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); 
       6:  
       7:     Application.DoEvents();
       8:     ViewKeyState();
       9:     
      10: }
      11:  
      12: //设置Caps Lock
      13: private void btnCaps_Click(object sender, EventArgs e)
      14: {           
      15:  
      16:     keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
      17:     keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
      18:     
      19:  
      20:     Application.DoEvents();
      21:     ViewKeyState();
      22: }
      23:  
      24: //设置Scroll Lock
      25: private void btnScroll_Click(object sender, EventArgs e)
      26: {          
      27:     
      28:     keybd_event(VK_SCROLL, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
      29:     keybd_event(VK_SCROLL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
      30:    
      31:     Application.DoEvents();
      32:     ViewKeyState();
      33: }

    ViewKeyState方法是刷新三个灯的状态以及按键显示文字。

       1: /// <summary>
       2: /// 显示状态
       3: /// </summary>
       4: private void ViewKeyState()
       5: {
       6:     //获取键状态
       7:     bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
       8:     bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
       9:     bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
      10:          
      11:     //根据键状态设置按钮文字       
      12:     btnCaps.Text= CapsLock ? "关闭":"开启";
      13:     btnNum.Text = NumLock ? "关闭" : "开启";
      14:     btnScroll.Text = ScrollLock ? "关闭" : "开启";            
      15:  
      16:     //显示状态
      17:     rdbCapsLock.Checked= CapsLock;
      18:     rdbNumLock.Checked= NumLock;
      19:     rdbScrollLock.Checked= ScrollLock;
      20: }

    可以把Windows自带的虚拟键盘调用出来看一下效果:

    kB

    声明:由于是一年多前做的东西了,也忘了参考的那些网站,不能给出链接,在此表示歉意。

    代码下载

  • 相关阅读:
    js截取字符串区分汉字字母代码
    List 去处自定义重复对象方法
    63. Unique Paths II
    62. Unique Paths
    388. Longest Absolute File Path
    41. First Missing Positive
    140. Word Break II
    139. Word Break
    239. Sliding Window Maximum
    5. Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/wk986/p/1820850.html
Copyright © 2011-2022 走看看