검색결과 리스트
글
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 |
RECENT COMMENT