如何无休止地检查是否按下了键

本文关键字:是否 检查 无休止 | 更新日期: 2023-09-27 18:30:20

我正在制作一个小程序,显示数字锁定或Capslock是打开还是关闭(因为我的笔记本电脑没有这些LED,所以我知道做这样的东西会很有趣)。我试图实现的是,如果按下或不按下键,文本会发生变化。到目前为止,我所拥有的是程序显示它们在自行运行程序之前是打开还是关闭。如何使程序对更改做出反应?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
       public static extern short GetKeyState(int keyCode);

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            looper();
        }
        public void looper()
        {
            cLock_check();
            nLock_check();
            sLock_check();
        }
        public void cLock_check()
        {
            bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
            if (CapsLock)
                lbl_cLock_onOff.Text = "ON";
            else
                lbl_cLock_onOff.Text = "OFF";
        }
        public void nLock_check()
        {
            bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
            if (NumLock)
                lbl_nLock_onOff.Text = "ON";
            else
                lbl_nLock_onOff.Text = "OFF";
        }
        public void sLock_check()
        {
            bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
            if (ScrollLock)
                lbl_sLock_onOff.Text = "ON";
            else
                lbl_sLock_onOff.Text = "OFF";
        }
    }
}

如何无休止地检查是否按下了键

应实现全局键盘挂钩,如本文中所述。将vkCodeVK_NUMLOCKVK_CAPITALVK_SCROLL进行比较,并调用相关的更新函数。

创建一个计时器对象,给它一个合理的间隔(对于大多数"响应式"UI 问题,300 毫秒是合适的),并设置 Tick 处理程序以调用 looper 方法:

Timer checkState;
public Form1()
{
    InitializeComponent();
    checkState = new Timer { Interval = 300};
    checkState.Tick += (o,e) => looper();
    chechState.Start();
}