実行中のモジュールを取得 <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