윈도우와 관련된 쓰레드ID와 프로세스ID를 얻는다.
● 선언
Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
● 인수
hWnd ━ 프로세스나 쓰레드 ID를 알고자 하는 윈도우 핸들
lpdwProcessId ━ 윈도우를 생성한 쓰레드를 포함하는 프로세스 ID 저장할 변수
● 반환
윈도우를 생성시킨 쓰레드 ID
다음은 예제 소스로, 현재 마우스 커서를 클릭 함으로, 클릭시 커서 아래에 있는 윈도우를 포함하는 프로세스의 ID(PID)를 얻어 프로세스를 종료시킨다
다음은 폼 모듈이다.
Option Explicit ' 모든 변수는 선언된 뒤에 사용할 수 있다.
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long ' 훅체인에 훅프로시저를 선두에 끼워넣는다, 성공하면 훅프로시저의 핸들을 복귀한다.
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long ' 훅체인에서 훅 핸들이 나타내는 훅 프로시저를 제거한다.
Private Const WH_MOUSE_LL = 14
Private hhkLowLevelMouse As Long ' 훅 설치가 완료되는경우, 그 훅을 나타내는 핸들
Private Sub Form_Load()
GetWindowThreadProcessId Me.hwnd, MyPid
hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, App.hInstance, 0)
End Sub
Private Sub Form_Unload(Cancel As Integer)
If hhkLowLevelMouse = 0 Then Exit Sub
UnhookWindowsHookEx hhkLowLevelMouse ' 훅을 체인에서 훅 제거한다.
hhkLowLevelMouse = 0
End Sub
' 다음은 일반 모듈 소스이다.
Option Explicit ' 모든 변수는 선언된 뒤에 사용할 수 있다.
Public TopWindow As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) ' 메모리 내용을 복사한다.
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long ' 훅체인에서 다음 훅프로시저를 호출한다.
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Const PROCESS_TERMINATE As Long = (&H1)
Private Const HC_ACTION = 0
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const WM_LBUTTONDOWN = &H201
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Type MSLLHOOKSTRUCT
pt As POINTAPI
mouseData As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type
Public MyPid As Long ' 현재 프로세스의 PID
Public Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim p As MSLLHOOKSTRUCT
Dim Windowhwnd As Long ' 마우스 위치의 윈도우 핸들
Dim Pid As Long
If (nCode = HC_ACTION) And wParam = WM_LBUTTONDOWN Then
CopyMemory p, ByVal lParam, Len(p)
Windowhwnd = WindowFromPoint(p.pt.X, p.pt.Y)
GetWindowThreadProcessId Windowhwnd, Pid
If Not Pid = MyPid Then KillByPid Pid ' 현재 프로세스 인경우는 제외
End If
LowLevelMouseProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End Function
Public Sub KillByPid(ByVal Pid As Long) ' 프로세스 ID에 의해 프로세스를 강제 종료 시킨다
Dim hwnd As Long
hwnd = OpenProcess(PROCESS_TERMINATE, False, Pid)
TerminateProcess hwnd, 0&
CloseHandle hwnd
End Sub
'API' 카테고리의 다른 글
VB6에서 API 사용법. (0) | 2011.10.09 |
---|---|
시스템에 전체 시리얼 포트 얻기 (0) | 2011.10.08 |
CopyMemory를 사용한 배열 정보 얻기 (0) | 2011.10.07 |
SetWindowPos을 사용한 최상위 윈도우 만들기 (0) | 2011.10.06 |
SetWindowsHookEx를 사용한 마우스 전역 훅 (0) | 2011.10.06 |