C#如何监听键盘Caps lock键按下事件?

Aspirant_Happy 2020-03-11 11:24:33
我想知道在密码文本输入框,按下Caps lock键,我想要监听到这个事件,做出响应,而不是单纯的检测Caps lock的状态,Caps lock键对应的ASC2码是20,可是当键盘按下时却监听不到,结果没有响应,假设我监听其他键按下时却可以,请问这是为什么呀,是因为有些键不能直接获取对应的ASC整型码吗?请大神指点该怎么做
...全文
307 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aspirant_Happy 2020-03-11
  • 打赏
  • 举报
回复
引用 1 楼 良朋的回复:
用KeyDown判断KeyCode

if (e.KeyCode== Keys.CapsLock)
{

}
刚刚试了一下,KeyDown可以,为什么KeyPress不行,好奇怪
asq985 2020-03-11
  • 打赏
  • 举报
回复
e.KeyValue
良朋 2020-03-11
  • 打赏
  • 举报
回复
用KeyDown判断KeyCode

if (e.KeyCode== Keys.CapsLock)
{

}
ITFU 2020-03-11
  • 打赏
  • 举报
回复
也可以试试keyup
desperaso 2020-03-11
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Test_7
{
public class KeyRecord
{
public List<string> _Record = new List<string>();
public RichTextBox r1 = new RichTextBox() { Size = new Size(400, 300) };

private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
private const int WM_SYSKEYDOWN = 0x104;
private const int WM_SYSKEYUP = 0x105;
public event KeyEventHandler OnKeyDownEvent;
public event KeyEventHandler OnKeyUpEvent;
public event KeyPressEventHandler OnKeyPressEvent;
static int hKeyboardHook = 0;
public const int WH_KEYBOARD_LL = 13;
HookProc KeyboardHookProcedure;
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
[DllImport("user32")]
public static extern int GetKeyboardState(byte[] pbKeyState);
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
public KeyRecord()
{
this.OnKeyPressEvent += new KeyPressEventHandler(KeyBordHook_OnKeyPressEvent);
Start();
}
public void Start()
{
if (hKeyboardHook == 0)
{
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
Module m = Assembly.GetExecutingAssembly().GetModules()[0];
IntPtr itp = Marshal.GetHINSTANCE(m);
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, itp, 0);
if (hKeyboardHook == 0) Stop();
}
}
public void Stop()
{
bool retKeyboard = true;
if (hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
}
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null))
{
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
if (OnKeyPressEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
r1.AppendText("KeyCode:" + MyKeyboardHookStruct.vkCode + "| Time:" + DateTime.Now + "\r");
}
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
private void KeyBordHook_OnKeyPressEvent(object sender, KeyPressEventArgs e) { }
}

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
KeyRecord kr = new KeyRecord();
kr.r1.Location = new Point(10, 10);
this.Controls.Add(kr.r1);
kr.Start();
}
}
}
lzhdim 2020-03-11
  • 打赏
  • 举报
回复
用 KeyDown 。。。
ERDY1337 2020-03-11
  • 打赏
  • 举报
回复
keydown是按下一个按键,比如大小写,小键盘锁等 keypress是键入一个字符,比如字母键,数字键 Capslock是属于第一种,不会键入字符的,所以keypress不行

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧