- ベストアンサー
VBで実行中のEXEファイルの情報を取得したい
WindowsXPでVB6.0でプログラムを組んでますが、その中であるEXEファイルを起動するようにしています。しかし、そのEXEが起動している場合は二重起動を避けるようにしたいのです。 使っているPCで起動されているいくつかのEXEから目的のEXEが起動しているかどうかを知りたいです。 FindWindowを使うには開いているファイル名まで変数の中に渡さなければならないため使えません。(開いているファイル名は不明として下さい) タスクマネージャーの「プロセス」タブのイメージ名に出てくるexeファイル名を取得できればいいのですが、方法をご存知の方おられませんか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ご参考にしてください。 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
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 > 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
お礼
API関数について勉強できました。知らなかったことが多いので参考になりました。ありがとうございました。
- ProKaseifu
- ベストアンサー率51% (98/192)
二重起動が防げればいいんでしょうか? http://msdn.microsoft.com/ja-jp/library/cc720841.aspx
お礼
投稿どうもありがとうございました。
お礼
目的の情報が取得できました。ありがとうございました。