windows 갈고리

4918 단어 windows
1. 메시지 갈고리
팁: 시스템 수준 갈고리를 설정하려면 갈고리 함수가 DLL에 있어야 합니다.
SetWindowsHookEx(
  idHook: Integer;   {    }
  lpfn: TFNHookProc; {    }
  hmod: HINST;       {         (EXE、DLL)  ;     HInstance;              0}
  dwThreadId: DWORD  {     ;    GetCurrentThreadId       ; 0         }
): HHOOK;            {       ; 0     }

//     idHook   :
WH_MSGFILTER       = -1; {   ;             }
WH_JOURNALRECORD   = 0{   ;                     ,             ;       }
WH_JOURNALPLAYBACK = 1{   ;     WH_JOURNALRECORD      ,                 }
WH_KEYBOARD        = 2{       ;       }
WH_GETMESSAGE      = 3{       ;             }
WH_CALLWNDPROC     = 4{       ;             ,   SendMessage      }
WH_CBT             = 5{       ;         ,   :      、  、  、     、    }
WH_SYSMSGFILTER    = 6{   ;                  }
WH_MOUSE           = 7{       ;       }
WH_HARDWARE        = 8{       ;        (   、  )   }
WH_DEBUG           = 9{       ;           ,       }
WH_SHELL           = 10; {       ;              }
WH_FOREGROUNDIDLE  = 11; {       ;             }
WH_CALLWNDPROCRET  = 12; {       ;              ,   SendMessage      }

 2.이벤트 훅
메시지 갈고리는 응용 프로그램이 시스템 메시지를 처리하기 전에 캡처하고 미리 처리하며 메시지를 계속 전송할지 결정할 수 있다. 일부 윈도우즈 이벤트는 메시지 대응이 없다. 예를 들어 팝업 메뉴, 창 전환, 초점 얻기, 스크롤 바 스크롤 등이다. 이 이벤트를 캡처하려면 SetWin Event Hook을 사용할 수 있다. 그 원형은 다음과 같다.
 
HWINEVENTHOOK WINAPI SetWinEventHook(  __in  UINT eventMin,  __in  UINT eventMax,  __in  HMODULE hmodWinEventProc,  __in  WINEVENTPROC lpfnWinEventProc,  __in  DWORD idProcess,  __in  DWORD idThread,  __in  UINT dwflags);
 
상세한 설명은 MSDN: http://msdn.microsoft.com/en-us/library/dd373640(VS.85).aspx을 보십시오. 그 중에서 네 번째 매개 변수는 메시지 갈고리와 같은 리셋 함수입니다. 설명은 다음과 같습니다. http://msdn.microsoft.com/en-us/library/dd373885(VS.85).aspx.
 
Win Event Hook의 첫 번째, 두 개의 매개 변수는 하나의 범위를 표시하여 어느 범위의 이벤트를 캡처하는지를 나타낼 수 있다. 실제로 win32에서 이 이벤트의 ID는 defined로 직접 작은 이벤트에서 큰 이벤트로 정의된 것이기 때문에 두 개의 매크로는 각각 가장 작은 이벤트 ID와 가장 큰 이벤트 ID(EVENT MIN과 EVENT MAX)를 나타낸다. 만약에 이 두 개의 매개 변수를 이벤트민과 이벤트맥스에 각각 전달하면 모든 이벤트를 캡처할 수 있다.구체적으로 캡처할 수 있는 이벤트는 MSDN에서 조회할 수 있습니다: http://msdn.microsoft.com/en-us/library/dd318066(VS.85).aspx.
 
Hook을 중지하려면 다음과 같이 UnhookWinEvent를 호출합니다.
 
BOOL WINAPI UnhookWinEvent(  __in  HWINEVENTHOOK hWinEventHook);
3. 양자 차이
(1) SetWindows HookEx에는 두 가지 갈고리 함수가 있는데 하나는 전역 갈고리(global hook), 다른 하나는 스레드 갈고리(thread hook)이다.전역 갈고리는 모든 라인의 정보를 캡처할 수 있지만, 전역 갈고리 함수는 dll에 존재해야 합니다.루틴 갈고리는 현재 프로세스에 속하는 루틴 정보만 캡처할 수 있으며, 갈고리 함수는 dll에 넣을 필요가 없습니다.SetWin EventHook에도 두 가지 갈고리 함수가 있는데 하나는 프로세스 내 갈고리(in-context hook), 다른 하나는 프로세스 외부 갈고리(out-of-context hook)이다.프로세스 내의 갈고리 함수는 dll에 넣어야 하며 모든 프로세스에 비추어야 합니다.프로세스 외부 갈고리 함수는 다른 프로세스에 비치지 않기 때문에 dll에 넣을 필요가 없습니다.프로세스 내나 프로세스 밖의 갈고리를 막론하고 모든 프로세스의 정보를 캡처할 수 있으며, 차이점은 프로세스 내의 갈고리 효율이 더 높다는 것이다.
(2) SetWindowsHookEx와 SetWinEventHook 두 가지 방법으로 캡처한 메시지의 유형이 다르다.SetWindowsHookEx는 모든 WM을 캡처할 수 있습니다첫소식.SetWin EventHook이 캡처한 소식은 모두 EVENT처음에 이 메시지들은 모두 대상의 상태와 관련이 있기 때문에 루트 마우스 키보드와 관련된 정보를 얻을 수 없습니다.
(3) SetWindowsHookEx가 설정한 전역 갈고리는 다른 프로세스에 주입되어야 하기 때문에 제한된 프로세스의 메시지를 캡처할 수 없습니다. 예를 들어 명령줄 창 (console window).SetWin Event Hook의 프로세스 외부 갈고리는 이 제한이 없습니다.

좋은 웹페이지 즐겨찾기