9

我需要捕捉我在键盘上键入的所有内容,然后以多种方式存储它。我更喜欢用 C# 为 .Net 编写它,但任何事情都可以。我写这个“键盘记录器”的原因很简单:

最近,我成为了 Peregrine 游戏手套的拥有者。这是一个非常酷的东西,它可以让你通过用手指做手势来发出命令,同时,它是一个非常薄的手套,所以你可以用那只手打字而不会感到不适。

另外,我发现了一个名为 AutoHotkey 的好程序,它可以通过为任何动作制作宏来极大地提高您的工作效率。您可以将任何键绑定到任何其他键或一系列键或命令。

问题是,你不能说“这是我最常做的”和“这是我很少使用的”。真的,你能说出你更多地使用哪个键,向下翻页还是向下翻页?与转义或布局切换(ctrl-shift 或 alt-shift)相比,您是否更频繁地使用 alt+tab?我不能说。如果没有统计数据,我无法判断应该自动化哪些操作或切换到更简单的界面。

所以我想编写一个程序在后台运行并记录我输入的所有内容。然后,该程序将存储我的操作的一阶,二阶和三阶直方图(例如,它将存储我按下任何单个键的次数,例如输入,我按下连续两个键的次数,例如 alt 和 tab,以及我连续按下三个键的次数,例如 ctrl、alt 然后删除或 ctrl、shift 然后退出)

然后,在花费一些时间工作/玩/其他之后,我将获得有关我应该尝试绑定到该界面(手套)或使用 AutoHotkey 程序自动化的操作的信息,以提高与 PC 交互的速度。

换句话说,简单的科学实验,只是为了好玩和进步:)

4

2 回答 2

6

老问题但是...

在 Windows 中,您可以使用user32.dll的 API 。

对于一个非常简单的键盘记录器,您可以使用 GetAsyncKeyState() 方法检查是否按下了 ASCII 表的每个字符。

在控制台应用程序中编写的一个非常简单和愚蠢的键盘记录器的整个代码将是:

[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(Int32 i);
    
static void Main(string[] args)
{
    while (true)
    {
        Thread.Sleep(100);
    
        for (int i = 0; i < 255; i++)
        {
            int keyState = GetAsyncKeyState(i);
            // replace -32767 with 32769 for windows 10.
            if (keyState == 1 || keyState == -32767)
            {
                Console.WriteLine((char)i);
                break;
            }
        }
    }

击键API

对于那些正在寻找更强大和更清洁的东西的人,我创建了一个 API,使其变得简单。你只需要这样做:

api.CreateKeyboardHook((character) => { Console.Write(character); });

更多细节在这里:https ://github.com/fabriciorissetto/KeystrokeAPI

于 2015-09-29T19:31:39.607 回答
5

您需要一个全局键盘处理程序。

如果这是 Windows,则必须使用 Windows API 并使用以下内容:

SetWndowsHookEx

UnhookWindowsHookEx

CallNextHookEx

您需要设置一个全局“挂钩”来监听键盘和鼠标事件。

我有一个 C# 类可以执行此操作并引发 .Net 键盘和鼠标事件参数,但我不打算在线发布代码,因为这种类型的活动可用于恶意手段。

我们为什么这样做?我们将 powerpoint 嵌入到我们的应用程序中,但我们不希望用户在查看它们的同时编辑 powerpoint 幻灯片,因此从我们的 C# 应用程序中,我们设置了一个挂钩来监视和拦截在 powerpoint 控件中的鼠标和键盘事件。效果很好,但我们必须确保:

它们控制着我们的应用程序,我们的应用程序处于活动状态等。一旦你设置了钩子,它就会监听/捕获包括其他应用程序在内的所有内容,因为我们取消了特定的键盘操作,我们只在需要时才想要它。

这是一个 API 链接。

http://msdn.microsoft.com/en-us/library/ff468842(v=VS.85).aspx

于 2011-06-24T17:00:08.333 回答