在我的应用程序在后台时监视C#中的键盘活动

Tan*_*zio 12 .net c# windows keyboard keyboard-hook

首先,我需要明确表示我对键盘记录没兴趣.

我的应用程序在后台时,我需要一种方法来监控最基本的键盘活动.我不需要知道哪些键,我不需要保存任何数据,我根本不需要或计划隐藏我的应用程序,我只需知道何时按下键并调用方法.

我正在寻找最简单的方法来实现这一目标,我知道合理数量的C#,但没有太复杂,因为我的大部分知识都是自学成才.

我四处寻找一些合适的方法来做这件事,我发现没有什么用处.我发现的是一群人在论坛和深度键盘记录器的源代码上说"不,那是非法的".

如果你们中的任何人可以告诉我实现这一目标的方法,那么我将非常感激.

Mes*_*esh 5

你需要使用Window Hooks:

C#中的低级键盘挂钩

但要注意,Windows安全性可能会保护我们不要做你想做的事情!


Ste*_*edy 5

您可以使用 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

您需要拨打电话Subscribe()才能开始收听和Unsubscribe()停止收听。显然,您需要进行修改GlobalHookKeyPress()才能完成有用的工作。

我需要这个功能来编写一个实用程序,当按下任何键(包括 CTRLKeyPress 键)时,该实用程序将打开 Lenovo Thinkpad 上的键盘背光。为此,我必须监视按键按下情况。代码是相同的,除了我们附加到不同的事件......

    _globalHook.KeyDown += GlobalHookOnKeyDown;
Run Code Online (Sandbox Code Playgroud)

并且事件处理程序签名不同:

    private static void GlobalHookOnKeyDown(object sender, KeyEventArgs e)
    {
        Console.WriteLine("KeyDown: \t{0}", e.KeyCode);
    }
Run Code Online (Sandbox Code Playgroud)

该库还可以检测特定的组合键和序列。例如:

    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"); } }
    });
Run Code Online (Sandbox Code Playgroud)


Jos*_*ake 2

Microsoft 告诉您如何:在表单级别处理键盘输入。只要您处理相同的事件,这适用于任何非 Web 应用程序。

您还应该看看这里的其他问题,例如处理来自键盘楔的输入