首先,我需要明确表示我对键盘记录不感兴趣。
我需要一种方法来监视我的应用程序在后台运行时在最基本的级别上监视键盘活动。我不需要知道哪些键,我不需要保存任何数据,我根本不需要或计划隐藏我的应用程序,我所需要的只是知道何时按下键并调用方法。
我正在寻找最简单的方法来做到这一点,我知道合理数量的 C#,但没有什么太复杂,因为我的大部分知识都是自学的。
我四处寻找一些合适的方法来做到这一点,但我没有发现任何有用的东西。我发现只有一群人在论坛和深度键盘记录器的源代码上说"不,这是非法的"。
如果你们中的任何人能就实现这一目标的方法向我提出建议,我将不胜感激。
你需要使用窗口挂钩:
C# 中的低级键盘挂钩
但请注意,Windows 安全性可能会保护我们不要做您想做的事!
可以使用 Nuget 包 MouseKeyHook (GitHub) 在后台监视键盘和鼠标活动。
此代码检测何时按下某个键:
private IKeyboardMouseEvents _globalHook;
private void Subscribe()
{
if (_globalHook == null)
{
// Note: for the application hook, use the Hook.AppEvents() instead
_globalHook = Hook.GlobalEvents();
_globalHook.KeyPress += GlobalHookKeyPress;
}
}
private static void GlobalHookKeyPress(object sender, KeyPressEventArgs e)
{
Console.WriteLine("KeyPress: t{0}", e.KeyChar);
}
private void Unsubscribe()
{
if (_globalHook != null)
{
_globalHook.KeyPress -= GlobalHookKeyPress;
_globalHook.Dispose();
}
}
您需要呼叫Subscribe()
才能开始收听,Unsubscribe()
才能停止收听。显然,您需要修改GlobalHookKeyPress()
才能完成有用的工作。
我需要这个功能来编写一个实用程序,当按下任何键时,它将打开联想Thinkpad上的键盘背光,包括CTRL(KeyPress
无法捕获)。为此,我不得不监视键关闭。代码是相同的,只是我们附加到不同的事件...
_globalHook.KeyDown += GlobalHookOnKeyDown;
并且事件处理程序签名不同:
private static void GlobalHookOnKeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("KeyDown: t{0}", e.KeyCode);
}
该库还可以检测特定的组合键和序列。例如:
Hook.GlobalEvents().OnCombination(new Dictionary<Combination, Action>
{
{ Combination.TriggeredBy(Keys.A).Control(), () => { Console.WriteLine("You Pressed CTRL+A"); } },
{ Combination.FromString("Shift+Alt+Enter"), () => { Console.WriteLine("You Pressed FULL SCREEN"); } }
});
>Microsoft告诉您如何:在窗体级别处理键盘输入。 只要您处理相同的事件,这适用于任何非 Web 应用程序。
您还应该查看有关 SO 的其他问题,例如处理来自键盘楔块的输入
RegisterHotKey windows API注册Windows Hot Key,请看这篇博客文章:
http://www.liensberger.it/web/blog/?p=207