Q&A

  • 훅킹에 관한 질문
수고 많으십니다.

친구의 소개로 델파이 잡지를 알게 되어 무척 흥미있게

공부를 하고 있습니다. 정말 재미 있더군요.

가끔식 제가 머리를 자극해서 더욱더 재미있는 것 같습니다.

그런데 훅킹을 보다가 이해가 안 되는 부분이 있어서

이렇게 질문을 올립니다.



마우스 훅킹을 하려면 마우스프로시져를 작성하게 되지요.

제가 원하는 것은 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



1  COMMENTS
  • Profile
    김종환 1999.08.01 13:12
    말주변이 없어서 그냥 소스를 올립니다. 힌트만 주는것이 본인에겐

    더 도움이 될텐데 소스 분석도 도움이 많이 되니, 열심히 공부 하셔서

    훌륭한 프로그래머가 됩시다.



    저두 여기서 배운겁니다.



    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를 재부탕 해야 하므로******

    ***********각각 하나씩 훅킹을.... 제가 조금 고생을... ****************





    --------------------------답변란에 내이름이 가득할 날을 꿈꾸며-------

    • Lyle
    • 1999.07.31 23:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      1999.07.31 23:24
      Lyle 께서 말씀하시기를... > winsock2.pas 에 보면 WSAEVENT 는 THANDLE type 이더군요. 그런데 THANDLE ...
    • 조호영
    • 1999.07.31 22:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김종환
      1999.08.01 13:12
      말주변이 없어서 그냥 소스를 올립니다. 힌트만 주는것이 본인에겐 더 도움이 될텐데 소스 분석도 도움이 ...
    • 최영란
    • 1999.07.31 22:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.07.31 23:04
      안녕하세요. 아래방식으로 한번 해보시죠. -.-;; type TLoveMe = procedure of Object; TForm1 ...
    • 최수영
      1999.08.04 04:42
      최수영 께서 말씀하시기를... > TreeView를 사용하여 부서코드,우편번호테이블을 검색 Add,AddChild를 동...
    • 델초보
    • 1999.07.31 06:55
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      1999.07.31 23:09
      델초보 께서 말씀하시기를... > 안녕하세요. > 다시 질문드리는데요. > 앞에 구창민님께서 말씀하신데로...
    • 김범환
    • 1999.07.31 05:18
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최석기
      1999.07.31 20:50
      김범환 께서 말씀하시기를... > sql콤퍼넌트의 sql을 이용하여 데이타베이스의 레코드를 추가하면 "Error ...
    • 박임선
    • 1999.07.31 03:46
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박임선
      1999.07.31 19:11
      박임선 께서 말씀하시기를...원인및 해결책 찾았습니다. ===>> DB Explorer 버그였습니다. 화...
    • 곽승주
    • 1999.07.31 03:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유도삼
      1999.08.01 00:38
      곽승주 께서 말씀하시기를... > 안녕하세요. > 퀵리포트를 사용하는데 미리보기는 잘되는데 출력이 안됩...
    • 구창민
      1999.08.01 00:01
      델피언 이라면 반드시 읽어야 할 이야기.. 출처 : 마소 - '감사'라는 한 마디 - '성당과 시장'. ...
    • 김영대
      1999.07.31 03:01
      류미희 께서 말씀하시기를... > StringGrid에 오라클DB를 조회하는데 Open명령 후 > 덩치가 큰 Query를 ...
    • 이창희
    • 1999.07.31 01:43
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최석기
      1999.07.31 20:45
      이창희 께서 말씀하시기를... > 페이지 컨트롤의 Tab Sheet를 동적으로 생성하여, > 기존에 만들어져 있...
    • 이무순
    • 1999.07.31 01:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      1999.07.31 01:54
      이무순 께서 말씀하시기를... > 전번의 답변 고맙습니다. > 이번에는 같은 형식인데 DB에서 값을 읽어서 ...
    • 김태균
      1999.07.31 22:31
      음.... 안녕하셔요. 델파이 4.0하고 NSSQL7.0사이에 생기는 문제는 델파이 4.0이 MSSQL 7.0보다 먼저 ...
    • 김수지
      1999.08.06 17:44
      서비스팩을 install 했는데도 잘 안돼는것 같아요. #3 까지 install 했거든요. 다른 방법 없...
    • 김태균
      1999.08.06 18:22
      제가 소스를 안봐서 정확하게 어디가 문제가 있는건지 아니면 진짜로 델파이하고 MSSQL상에 연결에 문제가...
    • 최석기
    • 1999.07.31 00:00
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      1999.07.31 00:50
      최석기 께서 말씀하시기를... > 안녕하세요.. > 다름이 아니오라 제가 다른 사람 프로그램을 하나 수정하...
    • 최석기
      1999.07.31 01:36
      창민님 답변 감사드립니다. 지금 창민님이 말씀하신것 마냥 사용하고 있습니다. 메인 프로그램에 종속되...
    • 구창민
      1999.07.31 01:51
      구창민입니다. 음..이건 꽁수같지만..도움이 된다면..^^; 타이머를 이용해서 종속 실행파일 프로젝트 소...