VBS如何确定程序是否正在运行

VBS如何确定程序是否正在运行

问题描述:

我需要一种方法来确定是否使用VBScript打开具有可见窗口的进程。VBS如何确定程序是否正在运行

例如,当我关闭SolidWorks窗口时,SolidWorks.exe进程仍在运行。

我怎样才能找出哪个是哪个?有什么建议么?

+2

通过“程序”定义*你*的含义。因为从操作系统的角度来看,只有进程。 – Tomalak 2014-12-05 09:39:27

+0

通过运行我的意思是它可以最大限度地发挥作用,而无需首先运行.exe文件。但solidworks的sldworks.exe过程在启动后第一次运行之后就会运行。关闭任何其他程序时关闭solidworks不会停止sldworks.exe进程,因此当我的VBS搜索solidworks是否打开时,它会得到肯定的结果,但是当命令发送到实体时,程序会出错,因为它不是真的开放..? – 2014-12-11 09:09:11

+0

所以你需要确定一个程序是否有*可见*窗口?我不认为用VBScript是可能的。你可以通过调用[Windows API函数'IsWindowVisible']来实现C或.NET程序(http://msdn.microsoft.com/zh-cn/library/ms633530%28v=vs.85%29.aspx ),但我有一种感觉,这个答案不是你想要的。 – Tomalak 2014-12-11 09:41:12

也许你可以使用命令行程序tasklist.exe找出右侧窗口是否打开。

如果您运行tasklist /V /FI "IMAGENAME eq sldworks.exe"并找出您感兴趣的流程与另一流程的区别,则可能会有效。

假设有一个特定的窗口标题你可以看看:

Dim pid = GetProcessId("sldworks.exe", "That window title") 
If pid > 0 Then 
    MsgBox "Yay we found it" 
End If 

其中GetProcessId()是这个

Function GetProcessId(imageName, windowTitle) 
    Dim currentUser, command, output, tasklist, tasks, i, cols 

    currentUser = CreateObject("Wscript.Network").UserName 

    command = "tasklist /V /FO csv" 
    command = command & " /FI ""USERNAME eq " + currentUser + """" 
    command = command & " /FI ""IMAGENAME eq " + imageName + """" 
    command = command & " /FI ""WINDOWTITLE eq " + windowTitle + """" 
    command = command & " /FI ""SESSIONNAME eq Console""" 
    ' add more or different filters, see tasklist /? 

    output = Trim(Shell(command)) 
    tasklist = Split(output, vbNewLine) 

    ' starting at 1 skips first line (it contains the column headings only) 
    For i = 1 To UBound(tasklist) - 1 
     cols = Split(tasklist(i), """,""") 
     ' a line is expected to have 9 columns (0-8) 
     If UBound(cols) = 8 Then 
      GetProcessId = Trim(cols(1)) 
      Exit For 
     End If 
    Next 
End Function 

Function Shell(cmd) 
    Shell = WScript.CreateObject("WScript.Shell").Exec(cmd).StdOut.ReadAll() 
End Function 

您不必返回PID,你也可以返回True/Falsetasklist提供的任何其他信息。作为参考,tasklist列索引是:

  • 0: “图像名”
  • 1: “PID”,
  • 2: “会话名称”
  • 3: “会话#”
  • 4: “MEM用法”,
  • 5: “状态”
  • 6: “用户名”
  • 7: “CPU时间”
  • 8:“窗口标题”

通过WMI可以实现更高级的与进程的交互。如何在VBScript中使用它的大量示例都遍布在Internet上。搜索Win32_Process