안녕하세요. 까마귀입니다.
여기 및 델코의 강좌란을 토대로 키보드 후킹을 만들었는데요.
메모리 맵을 사용해서 구현했습니다. DLL로...
버튼을 누르면 키보드가 아무것도 않 먹히도록.
강좌의 예제 소스가 위의 것을 구현한거라서 베껴서 만들었지요.
그런데, 한가지 문제가 생기더군요.
일단 프로그램을 실행해서 키보드가 않 먹도록 했고요.
다음에 윈도우창의 시작/실행을 눌러서 거기에 글이 써지는지 확인을 했습니다.
당근 않 먹지요.
그 뒤에, 취소버튼을 누르면 에러가 생기던데 이유를 모르겠습니다.
04x!:bff9de97의 모듈 KERNEL32.DLL에서 EXPLORER 잘못된 페이지 오류 발생.
왜 이 에러가 생기는지 알고 싶습니다. 해결책도요.
아래는 제가 만든 DLL의 내용입니다. 거의 예제 소스 그대롭니다.
var
FileMapObj : THandle;
HKbHook : HHook;
{ 메모리 맵 설정. }
function CreateMap() : Integer;
begin
FileMapObj := CreateFileMapping(
$FFFFFFFF, // 파일 연동 않함.
NIL, // 보안 문제 신경 않씀.
PAGE_READWRITE, // 읽고 쓰기.
0, // 크기 --> 상위 DWORD.
Sizeof(LongWord), // 크기 --> 하위 DWORD.
'KbHookMemoryMap' // 메모리 맵 파일의 이름.
);
Result := GetLastError;
end;
{ 메모리 맵 해제. }
function DestroyMap() : Boolean;
begin
Result := CloseHandle(FileMapObj); // 성공하면 0이 아닌값을 반환.
end;
{ 훅 프로시저 }
function MyKBHook(Code : Integer; wParam : WPARAM; lParam : LPARAM)
: LongInt; stdcall;
begin
// Code 값이 0보다 크거나 같을때만 갈구리질을 하는게 요령.
if Code >= 0 then
begin
// 키보드를 전부 않눌리게 한다.
// 다음 훅체인이 불리지 않도록 하면 끝.
Result := Integer(True);
Exit;
end;
Result := CallNextHookEx(HKbHook,Code,wParam,lParam);
end;
{ 키보드 훅 찍기. }
function HookKB() : Boolean;
begin
HKbHook := SetWindowsHookEx(WH_KEYBOARD,MyKBHook,HInstance,0);
Result := Boolean(HKbHook);
// 파일에 훅핸들 쓰기.
WriteData();
end;