Hooking : "Windows Key + C", "Windows Key + V" 를 인지하기 위해서 Keyboard Hooking

위 기능을 먼저 구현하도록 하겠습니다.
후킹은 이미 엄청나게 오래전부터 사용해온 기능(기술?)이기 때문에 어렵지 않습니다.
인터넷에 찾아보면 엄청나게 많거든요. :)


[Interface]
void Start(HOOKPROC proc, HINSTANCE hmod);
void Stop(); 

이렇게만 하면 될 것 같네요.
사실 "Windows Key + C" 와 같은 특정 조건에서만 Notify 를 받아도 되지만,
추후에 기능 확장에 의해서 Command 가 추가될 경우 곤란해 집니다.
그러므로 모든 Hooking 에 대해서 HookProc 가 받도록 하는게 낫습니다.

Hook Class 를 별도로 만들지 않은 이유는 크게 확장될것도 없고, 어차피 HookProc 는 사용하는 쪽에서 구현해야 하기 때문이죠.
더불어 Hooking 을 하려면, HookProc 는 static 이어야 합니다.
Class 로 만들어도 얻는 이점이 없어 보이네요.

 
    [KeyboardHook.h]


#pragma once


HHOOK hKeyboardHook = NULL;
HINSTANCE g_Module = NULL;
HOOKPROC g_callback = NULL;


LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) bool StartHook(HOOKPROC proc);
__declspec(dllexport) bool StopHook();
#ifdef __cplusplus
}
#endif




    [KeyboardHook.cpp]


#include <iostream>
#include "windows.h"
#include "KeyboardHook.h"

using namespace std;


BOOL APIENTRY DllMain( HANDLE hModule, DWORD  dwReason, LPVOID lpReserved)
{
	switch (dwReason)
	{
	case DLL_PROCESS_ATTACH:
		g_Module = (HINSTANCE)hModule; // Save Dll Handle
		break; 
	case DLL_PROCESS_DETACH:
		StopHook();
		g_Module = NULL;
		break;
	}
	return TRUE;
}


bool StartHook(HOOKPROC proc)
{
	if(hKeyboardHook != NULL) { return false; }

	g_callback = proc;
	hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, g_Module, 0);
	return (hKeyboardHook != NULL);
}



bool StopHook()
{
	if(hKeyboardHook == NULL) { return false; }

	if(UnhookWindowsHookEx(hKeyboardHook) == TRUE) { //제거
		hKeyboardHook = NULL;
	}
	return (hKeyboardHook == NULL);
}


LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{ 
	
	if(hKeyboardHook != NULL) {
		// -1 이 리턴되면 NextHook 호출 안함
		if(g_callback(nCode, wParam, lParam) == -1) {
			return -1;
		}
	}
	return ::CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); 
}





 


'개발 프로그램 > EasyClipper' 카테고리의 다른 글

Easy Clipper ver 2.0  (3) 2015.05.27
EasyClipper - 화면 캡처프로그램  (1) 2011.12.15
EasyClipper 개발 - 마무리  (1) 2011.12.15
EasyClipper 개발 - Canvas  (0) 2011.12.14
EasyClipper 기획  (0) 2011.12.13