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

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

代码下载

 

posted @ 2010-09-07 17:43  wk986  阅读(3275)  评论(3编辑  收藏  举报