2014-12-05 9 views
-1

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

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

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

+2

Определите, что * вы * подразумеваете под «программой». Потому что с точки зрения операционной системы есть только процессы. – Tomalak

+0

Запустив i, я имею в виду, что он доступен для максимизации без необходимости запуска файла .exe. Но у Solidworks есть процесс sldworks.exe, запущенный после того, как он впервые открывается после загрузки. Закрытие SolidWorks, когда вы закрываете любую другую программу, не останавливает процесс sldworks.exe, поэтому, когда мои VBS ищут, если openworks открыт, он получает положительный результат, но когда команда отправляется на печать, ошибки программы, потому что это не действительно открыт ..? –

+0

Итак, вам нужно определить, имеет ли программа * видимое * окно? Я не думаю, что это возможно с VBScript. Вы можете сделать это с помощью программы C или .NET, вызвав [функцию Windows API «IsWindowVisible»] (http://msdn.microsoft.com/en-us/library/ms633530%28v=vs.85%29.aspx), но я чувствую, что этот ответ не то, что вы искали. – Tomalak

ответ

0

Возможно, вы можете использовать программу командной строки 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: "Использование Mem",
  • 5: "Статус"
  • 6: "Имя пользователя"
  • 7: "Время ЦП"
  • 8: «Название окна»

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

Смежные вопросы