• ベストアンサー

VBで実行中のEXEファイルの情報を取得したい

WindowsXPでVB6.0でプログラムを組んでますが、その中であるEXEファイルを起動するようにしています。しかし、そのEXEが起動している場合は二重起動を避けるようにしたいのです。 使っているPCで起動されているいくつかのEXEから目的のEXEが起動しているかどうかを知りたいです。 FindWindowを使うには開いているファイル名まで変数の中に渡さなければならないため使えません。(開いているファイル名は不明として下さい) タスクマネージャーの「プロセス」タブのイメージ名に出てくるexeファイル名を取得できればいいのですが、方法をご存知の方おられませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.2

ご参考にしてください。 Sub ProcessID()   Dim objSet   Dim obj   Dim Locator   Dim Server   '   Set Locator = CreateObject("WbemScripting.SWbemLocator")   Set Server = Locator.ConnectServer   Set objSet = Server.ExecQuery("Select * From Win32_Process")   '   For Each obj In objSet     MsgBox "プロセス名=" & obj.Caption   Next   Set objSet = Nothing   Set obj = Nothing   Set Server = Nothing   Set Locator = Nothing End Sub

r33y305550
質問者

お礼

目的の情報が取得できました。ありがとうございました。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 > FindWindowを使うには開いているファイル名まで変数の中に渡さなければ > ならないため使えません。(開いているファイル名は不明として下さい) FindWindow の第1引数はクラス名を、第2引数にはウインドウタイトルを 渡します。ファイル名が不明であっても特定された EXE ならクラス名は固定 だと思いますので、問題ないと思いますよ。 FindWindow ではハンドルが取得できないものなのでしょうか? ■ WMI を使った方法(#2 ご回答にあるとおり) 動作環境を Win2000/XP/Vista(?) 等に限定すれば、WMI の Win32_Process クラスが使えます。Win9x 系, NT4.0 で WMI を利用するには、別途でイン ストールが必要になります。 http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=AFE41F46-E213-4CBF-9C5B-FBF236E0E875 ■ API を使った方法 Win95, NT5.0以降 で動作させる必要があるなら、API を使います。 こんな感じです。 Option Explicit Private 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 * 260 End Type Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" ( _     ByVal dwFlags As Long, _     ByVal th32ProcessID As Long) As Long Private Declare Function Process32First Lib "kernel32.dll" ( _     ByVal hSnapshot As Long, _     ByRef lppe As PROCESSENTRY32) As Long Private Declare Function Process32Next Lib "kernel32.dll" ( _     ByVal hSnapshot As Long, _     ByRef lppe As PROCESSENTRY32) As Long Private Const TH32CS_SNAPPROCESS  As Long = &H2 Sub EnumProcessSample()   Dim hSnap As Long   Dim rc  As Long   Dim pe  As PROCESSENTRY32   hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)   pe.dwSize = LenB(pe)   rc = Process32First(hSnap, pe)      Do While CBool(rc > 0)     ' // process id     Debug.Print "0x" & Right$("00000000" & Hex$(pe.th32ProcessID), 8);     Debug.Print vbTab;     ' // file name     Debug.Print Left$(pe.szExeFile, InStr(pe.szExeFile, vbNullChar) - 1)     rc = Process32Next(hSnap, pe)   Loop End Sub ■ トリッキーな方法 Word.Application の Tasks コレクションを利用します。 参考URL [ Office TANAKA - Excel VBA(実行中のタスク一覧(非API)) ] http://officetanaka.net/excel/vba/tips/tips61.htm

r33y305550
質問者

お礼

API関数について勉強できました。知らなかったことが多いので参考になりました。ありがとうございました。

回答No.1

二重起動が防げればいいんでしょうか? http://msdn.microsoft.com/ja-jp/library/cc720841.aspx

r33y305550
質問者

お礼

投稿どうもありがとうございました。

関連するQ&A