アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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
    • good
    • 2
この回答へのお礼

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

お礼日時:2009/02/28 14:53

こんにちは。



> 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? …

■ 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
    • good
    • 1
この回答へのお礼

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

お礼日時:2009/02/28 14:54

二重起動が防げればいいんでしょうか?



http://msdn.microsoft.com/ja-jp/library/cc720841 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/28 14:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A