난 정말 최고야 멋있어
[WinAPI] 키보드 후킹을 통한 스크린샷 막기 본문
#include <Windows.h>
#include <iostream>
using namespace std;
//typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
//vkey : https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
HHOOK _hhk;
LRESULT CALLBACK llkbdhook(int code, WPARAM wParam, LPARAM lParam)
{
LPKBDLLHOOKSTRUCT khs = (LPKBDLLHOOKSTRUCT)lParam;
if (wParam == WM_KEYDOWN && khs->vkCode == VK_SNAPSHOT)
{
keybd_event(VK_SPACE, khs->scanCode, khs->flags, khs->dwExtraInfo);
return 1;
}
return CallNextHookEx(_hhk,code,wParam,lParam);
}
int main()
{
_hhk = SetWindowsHookExW(WH_KEYBOARD_LL, llkbdhook, NULL, NULL);
if (!_hhk)
cout << "Hook Failed\n";
//메시지 루프가 없으면 후킹이 정상적으로 되지 않음
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
KEYBOARD_LL 의 lParam 변환
https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-kbdllhookstruct
SetWindowsHookExW의 세번째 인자가 GetModuleHandle(NULL)이 아닌 NULL 인 이유
MSDN에 보시면 나와있음.
대충 요약하면 자기 자신의 프로세스가 만든 쓰레드를 후킹할때는 NULL을 주라고 명시되어 있음
이때 글로벌 훅을 하기 위해 마지막 인자에 0을 주면... 결국 자기 자신 쓰레드도 후킹하게 되므로 NULL을 줘야지 정상적으로 작동함
+스크린샷 버튼을 누르면 스크린샷 대신 스페이스바가 출력되도록 했음
이것조차 원하지 않는다면.. keybd_event() 를 주석처리하면 됨