VBS Как определить, запущена ли программа

Мне нужен способ определить, открыт ли процесс с видимым окном, используя VBScript.

Например, когда я закрываю окно SolidWorks, процесс SolidWorks.exe продолжает работать.

Как узнать, что есть что? Какие-либо предложения?


person Emil Olsen    schedule 05.12.2014    source источник
comment
Определите, что вы подразумеваете под программой. Потому что с точки зрения операционной системы есть только процессы.   -  person Tomalak    schedule 05.12.2014
comment
Под запуском я подразумеваю, что он доступен для максимизации без предварительного запуска файла .exe. Но в Solidworks процесс sldworks.exe запускается после первого открытия после загрузки. Закрытие SolidWorks, когда вы закрываете любую другую программу, не останавливает процесс sldworks.exe, поэтому, когда мой VBS ищет, открыт ли SolidWorks, он получает положительный результат, но когда команда отправляется в Solid, программа дает ошибку, потому что это не так. действительно открыты..?   -  person Emil Olsen    schedule 11.12.2014
comment
Итак, вам нужно определить, есть ли в программе видимое окно? Я не думаю, что это будет возможно с VBScript. Вы можете сделать это с помощью программы C или .NET, вызвав функция Windows API IsWindowVisible, но у меня такое чувство, что этот ответ не то, что вы искали.   -  person Tomalak    schedule 11.12.2014
comment
Да, может быть и так. Однако это довольно большая программа, написанная на VBScript, для облегчения процесса инженерам-проектировщикам. Проблема в том, что прямо сейчас я не могу определить, запущена программа или нет, потому что, как вы говорите, видимое окно должно быть там, чтобы запускать команды оболочки.   -  person Emil Olsen    schedule 12.12.2014


Ответы (1)


Возможно, вы могли бы использовать программу командной строки 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/False или любую другую информацию, которую предоставляет tasklist. Для справки, индексы столбца tasklist:

  • 0: «Имя изображения»
  • 1: "ПИД",
  • 2: «Имя сеанса»
  • 3: «Сеанс №»
  • 4: «Использование памяти»,
  • 5: «Статус»
  • 6: «Имя пользователя»
  • 7: «Процессорное время»
  • 8: «Заголовок окна»

Более расширенное взаимодействие с процессами доступно через WMI. Множество примеров того, как использовать это в VBScript, можно найти в Интернете. Найдите Win32_Process.

person Tomalak    schedule 12.12.2014