GetWindowThreadProcessId는 윈도우 핸들에 대한 프로세스 ID와 쓰레드 ID를 얻을수 있다.

윈도우와 관련된 쓰레드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

+ Recent posts