スナップショットを取得(T)          <TOP>


GetCursorPos マウスカーソル(マウスポインタ)の現在の位置に相当するスクリーン座標を取得

WindowFromPoint 指定の座標位置にあるウィンドウハンドルを取得

GetWindowThreadProcessId ウィンドウのプロセスIDとスレッドIDを取得

CreateToolhelp32Snapshot プロセスのスナップショットを取得

Process32First 最初のプロセスに関する情報を取得

Process32Next 2番目以降のプロセスに関する情報を取得

CloseHandle オープンされているオブジェクトハンドルをクローズ

 

マウスを当てた座標のスナップショットを取得します。EXE名とそのハンドルを表示します。

 

'================================================================
'= スナップショット
'=    (SnapShot.bas)
'================================================================
#include "Windows.bi"

#define TH32CS_SNAPPROCESS &H2          'プロセス一覧のスナップショット
#define MAX_PATH 260

Type PROCESSENTRY32
    dwSize              As Long
    cntUsage            As Long
    th32ProcessID       As Long
    th32DefaultHeapID   As Long
    th32ModuleID        As Long
    cntThreads          As Long
    th32ParentProcessID As Long
    pcPriClassBase      As Long
    dwflags             As Long
    szexeFile           As String * MAX_PATH
End Type

Type POINTAPI
    x As Long
    y As Long
End Type

' マウスカーソル(マウスポインタ)の現在の位置に相当するスクリーン座標を取得
Declare Function Api_GetCursorPos& Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI)

' 指定の座標位置にあるウィンドウハンドルを取得
Declare Function Api_WindowFromPoint& Lib "user32" Alias "WindowFromPoint" (ByVal xPoint&, ByVal yPoint&)

' ウィンドウのプロセスIDとスレッドIDを取得
Declare Function Api_GetWindowThreadProcessId& Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hWnd&, lpdwProcessId&)

' プロセスのスナップショットを取得
Declare Function Api_CreateToolhelp32Snapshot& Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal dwFlag&, ByVal th32ProcessID&)

' 最初のプロセスに関する情報を取得する関数
Declare Function Api_Process32First& Lib "kernel32" Alias "Process32First" (ByVal hSnapshot&, lppe As PROCESSENTRY32)

' 2番目以降のプロセスに関する情報を取得する関数
Declare Function Api_Process32Next& Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot&, lppe As PROCESSENTRY32)

' オープンされているオブジェクトハンドルをクローズ
Declare Function Api_CloseHandle& Lib "kernel32" Alias "CloseHandle" (ByVal hObject&)

Var Shared Text(1) As Object
Var Shared Edit(1) As Object
Var Shared Timer1 As Object

For i = 0 To 1
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
    Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) : Edit(i).SetFontSize 14
Next
Timer1.Attach GetDlgItem("Timer1")

'================================================================
'=
'================================================================
Declare Function GetExeFromHWND(hWnd As Long) As String
Function GetExeFromHWND(hWnd As Long) As String
    Var ThreadID As Long
    Var ProcessID As Long
    Var Snapshot As Long
    Var Process As PROCESSENTRY32
    Var ProcessFound As Long
    Var ExeName As String
    Var Ret As Long
 
    'プロセスID取得
    ThreadID = Api_GetWindowThreadProcessId(hWnd, ProcessID)
 
    If ThreadID <> 0 and ProcessID <> 0 Then
        'スナップショット取得
        Snapshot = Api_CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
 
        If Snapshot = -1 Then Exit Function
 
        'プロセスサイズ
        Process.dwSize = Len(Process)
 
        '最初に見つかった
        ProcessFound = Api_Process32First(Snapshot, Process)

        Do While ProcessFound
            If Process.th32ProcessID = ProcessID Then
                'プロセスIDが見つかった場合、そのEXE名を取得
                If InStr(Process.szexeFile, Chr$(0)) > 0 Then
                    ExeName = Left$(Process.szexeFile, InStr(Process.szexeFile, Chr$(0)) - 1)
                End If
                Exit Do
            Else
                '見つからない場合次を探す
                ProcessFound = Api_Process32Next(Snapshot, Process)
            End If
        Loop
 
        'ハンドルクローズ
        Ret = Api_CloseHandle(Snapshot)
    End If
 
    GetExeFromHWND = ExeName
End Function

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Timer1.SetInterval 10
    Timer1.Enable -1
End Sub

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    Var pa As POINTAPI
    Var hWnd As Long
  
    'マウス位置取得
    If Api_GetCursorPos(pa) <> 0 Then
        'マウスカーソル座標のハンドル取得
        hWnd = Api_WindowFromPoint(pa.x, pa.y)
    
        'EXE名
        Edit(0).SetWindowText GetExeFromHWND(hWnd)

        'ハンドル
        Edit(1).SetWindowText "&H" & hex$(hWnd)
    End If
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End