如何无休止地检查是否按下了键?
How to endlessly check if key was pressed?
我正在制作一个小程序,显示 numlock 或 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";
}
}
}
创建一个定时器对象,给它一个合理的时间间隔(对于大多数'responsive'UI问题,300毫秒是合适的),并设置Tick处理程序来调用looper
方法:
Timer checkState;
public Form1()
{
InitializeComponent();
checkState = new Timer { Interval = 300};
checkState.Tick += (o,e) => looper();
chechState.Start();
}
您应该实现全局键盘挂钩,如 this article 中所述。比较 vkCode
与 VK_NUMLOCK
、VK_CAPITAL
和 VK_SCROLL
并调用您的相关更新函数。
我正在制作一个小程序,显示 numlock 或 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";
}
}
}
创建一个定时器对象,给它一个合理的时间间隔(对于大多数'responsive'UI问题,300毫秒是合适的),并设置Tick处理程序来调用looper
方法:
Timer checkState;
public Form1()
{
InitializeComponent();
checkState = new Timer { Interval = 300};
checkState.Tick += (o,e) => looper();
chechState.Start();
}
您应该实现全局键盘挂钩,如 this article 中所述。比较 vkCode
与 VK_NUMLOCK
、VK_CAPITAL
和 VK_SCROLL
并调用您的相关更新函数。