수고 많으십니다.
친구의 소개로 델파이 잡지를 알게 되어 무척 흥미있게
공부를 하고 있습니다. 정말 재미 있더군요.
가끔식 제가 머리를 자극해서 더욱더 재미있는 것 같습니다.
그런데 훅킹을 보다가 이해가 안 되는 부분이 있어서
이렇게 질문을 올립니다.
마우스 훅킹을 하려면 마우스프로시져를 작성하게 되지요.
제가 원하는 것은 MouseMoveEvent 와 MouseDownEvent의 훅킹이어서
마우스 훅킹을 사용하려고 했습니다.(어디까지나 잡지를 보다가
한번 따라 해 보려고 한 것입니다)
그래서 제가 이해한 대로 이렇게 했죠.
library Hooking;
........
var
MainHandle: THandle;
..........
MainHandle := FindWindow('TMain',nil);
.............
function MouseProc(nCode: integer; wParam: Longint; Msg: DWord): Longint; stdcall;
begin
if (nCode >= 0)then begin
case wParam of
WM_MOUSEMOVE : SendMessage(MainHandle,WM_USER+2000,0,0);
WM_LBUTTONDOWN: SendMessage(MainHandle,WM_USER+2001,0,0);
end;
end;
result := CallNextHookEx(OldHHOOK, nCode, wParam, Msg);
end;
이렇게 하면 메세지를 받은 제 폼에서 마우스를 작동하게 했는데요,
문제는 제 폼 내에서만 루틴을 타고 제 폼 밖에서의 마우스이벤트는
동작하지 않았습니다.
제가 원하는 건 반대 인데 말이지요.
여하튼 전체 마우스 핸들에 대해서 이벤트 루틴을 타게 하고 싶은데
잘 안되는 군요.
(이렇게 하다가 안 되어서 시도한 다른 방법은
function MouseProc(nCode: integer; wParam: Longint; Msg: DWord): Longint; stdcall;
begin
if (nCode >= 0)then begin
SetCapture(MainHandle);
end;
result := CallNextHookEx(OldHHOOK, nCode, wParam, Msg);
end;
이렇게 하니까 딱 한 번만 마우스 이벤트를 타더군요.
사실은 잡지 97년 6월의 '투덜이 만들어 보기'와
97년 7월의 '훅킹' 기사를 읽고 따라 해 보다가
부딪힌 문제 입니다.)
제가 훅킹의 개념을 잘못 이해한 것은 아닌지 모르겠군요.
(참고로 이 마우스 훅킹 프로시져는
dll로 작성했고 그 dll 안에 SetWindowshookex, UnHookWindowsHookEx가
함께 있습니다.)
설명이 너무 지저분, 너저분, 이상했는지 모르겠습니다.
뭔가 잘못된 점을 발견하셨다면, 제발 도와주세요.....
그럼 좋은 시간 되시길 바랍니다.
from bluechos@hanmail.net
더 도움이 될텐데 소스 분석도 도움이 많이 되니, 열심히 공부 하셔서
훌륭한 프로그래머가 됩시다.
저두 여기서 배운겁니다.
library hotkey;
uses
SysUtils,
Classes,
windows,
messages;
var
HKbHook : HHOOK;
HMsHook : HHOOK;
const
HookDataFile = '.Hook.dat';
procedure ReadData;
var
F : TFileStream;
begin
try
F := Tfilestream.Create(HookDataFile, fmOpenRead);
try
F.Read(HKbHook, sizeof(HKbHook));
F.Read(HMsHook, sizeof(HkbHook));
finally
F.Free;
end;
except
end;
end;
procedure WriteData;
var
F : TFileStream;
begin
try
F := TFileStream.Create(HookDataFile, fmCreate);
try
F.Write(HKbHook, sizeof(HKbHook));
F.Write(HMsHook, sizeof(HMsHook));
finally
F.Free;
end;
except
end;
end;
{ 갈구리질 프로시저 }
function MyKbHook(Code : Integer; wParam : WPARAM;
lParam : LPARAM) : LongInt; stdcall;
begin
{ 파일에 저장된 훅핸들을 읽어온다. }
if HKbHook = 0 then
ReadData;
{ 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;
{ 키보드 갈구리 뽑기 }
function UnHookKb : Boolean;
begin
{ 파일에 저장된 훅핸들을 읽어온다. }
if HKbHook = 0 then
ReadData;
Result := UnhookWindowsHookEx(HKbHook);
end;
{ 갈구리질 프로시저 }
function MyMsHook(Code : Integer; wParam : WPARAM;
lParam : LPARAM) : LongInt; stdcall;
begin
{ 파일에 저장된 훅핸들을 읽어온다. }
if HMsHook = 0 then
ReadData;
{ Code값이 0보다 크거나 같을때만 }
{ 갈구리질을 하는 것이 요령. }
if Code >= 0 then
begin
{ 마우스를 몽땅 안눌리게 하자. }
{ 다음 훅체인이 불리지 않도록 하면 끝~! }
Result := Integer(True);
Exit;
end;
Result := CallNextHookEx(HMsHook, Code, wParam, lParam);
end;
{ 마우스 갈구리 찍기 }
function HookMs : Boolean;
begin
HMsHook := SetWindowsHookEx(
WH_MOUSE, MyMsHook, HInstance, 0);
Result := Boolean(HMsHook);
{ 파일에 훅핸들 쓰기 }
WriteData;
end;
{ 마우스 갈구리 뽑기 }
function UnHookMs : Boolean;
begin
{ 파일에 저장된 훅핸들을 읽어온다. }
if HMsHook = 0 then
ReadData;
Result := UnhookWindowsHookEx(HMsHook);
end;
Exports
HookKB, //키보드 후킹
UnHookKB, //키보드 언후킹
HookMS, //마우스 후킹
UnHookMs; //마우스 언후킹
begin
HKbHook := 0;
HMsHook := 0;
end.
프로그램에서 인포트 시켜 사용하면 시스템 전역에서 훅킹이 걸립니다.
*****주의: 키보드 마우스 둘다 훅킹을 걸면 PC를 재부탕 해야 하므로******
***********각각 하나씩 훅킹을.... 제가 조금 고생을... ****************
--------------------------답변란에 내이름이 가득할 날을 꿈꾸며-------