実行中のモジュールを取得          <TOP>


GetForegroundWindow ユーザが操作中のウィンドウを取得

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

OpenProcess 既存のプロセスオブジェクトのハンドルを取得

EnumProcessModules 指定されたプロセス内の各モジュールハンドルを取得

GetModuleFileNameEx ロードされている実行モジュールのフルパス名を取得(WindowsNT4.0以降)

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

 

 

'================================================================
'= 実行中のモジュールを取得
'= Windows NT/2000:Windows NT 4.0 以降
'=    (EnumProcessModules.bas)
'================================================================
#include "Windows.bi"

' ユーザーが操作中のウインドウを取得
Declare Function Api_GetForegroundWindow& Lib "user32" Alias "GetForegroundWindow" ()

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

' 既存のプロセスオブジェクトのハンドルを取得
Declare Function Api_OpenProcess& Lib "kernel32" Alias "OpenProcess" (ByVal dwDesiredAccess&, ByVal bInheritHandle&, ByVal dwProcessID&)

' 指定されたプロセス内の各モジュールのハンドルを取得(Windows NT/2000以降)
Declare Function Api_EnumProcessModules& Lib "psapi" Alias "EnumProcessModules" (ByVal Process&, ByRef lphModule&, ByVal cb&, ByRef lpcbNeeded&)

' ロードされている実行モジュールのフルパス名を取得
Declare Function Api_GetModuleFileNameEx& Lib "psapi" Alias "GetModuleFileNameExA" (ByVal Process&, ByVal hModule&, ByVal lpFilename$, ByVal nSize&)

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

#define PROCESS_QUERY_INFORMATION &H400 '取得したハンドルをGetExitCodeProcess関数、及びGetPriorityClass関数で使用できるようにする
#define PROCESS_VM_READ &H10            '取得したハンドルをReadProcessMemory関数で使用できるようにする

Var Shared List1 As Object
Var Shared Timer1 As Object

List1.Attach GetDlgItem("List1") : List1.SetFontSize 12
Timer1.Attach GetDlgItem("Timer1")

'================================================================
'=
'================================================================
Declare Function GetEXEFromHandle(hWnd As Long) As String
Function GetEXEFromHandle(hWnd As Long) As String
    Var ProcID As Long
    Var Temp As Long
    Var Modules(200) As Long
    Var File As String
    Var Process As Long
    Var Ret As Long

    If hWnd = 0 Then hWnd = Api_GetForegroundWindow()
  
    If Api_GetWindowThreadProcessId(hWnd, ProcID) <> 0 Then
        Process = Api_OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcID)
        If Process <> 0 Then
            Ret = Api_EnumProcessModules(Process, Modules(1), 200, Temp)
            If Ret <> 0 Then
                File = Space$(260)
                Ret = Api_GetModuleFileNameEx(Process, 0, File, Len(File))
                File = LCase$(Left$(File, Ret))
        
                GetEXEFromHandle = File
            End If
            Ret = Api_CloseHandle(Process)
        End If
    End If
End Function

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

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    Static Last As String
    Var File As String
  
    File = GetEXEFromHandle(0)
    If File <> "" And File <> Last Then
        Last = File
        List1.AddString File
        List1.SetCursel List1.GetCount - 1
    End If
End Sub

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