Возможно, вы можете использовать программу командной строки 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
.
Определите, что * вы * подразумеваете под «программой». Потому что с точки зрения операционной системы есть только процессы. – Tomalak
Запустив i, я имею в виду, что он доступен для максимизации без необходимости запуска файла .exe. Но у Solidworks есть процесс sldworks.exe, запущенный после того, как он впервые открывается после загрузки. Закрытие SolidWorks, когда вы закрываете любую другую программу, не останавливает процесс sldworks.exe, поэтому, когда мои VBS ищут, если openworks открыт, он получает положительный результат, но когда команда отправляется на печать, ошибки программы, потому что это не действительно открыт ..? –
Итак, вам нужно определить, имеет ли программа * видимое * окно? Я не думаю, что это возможно с VBScript. Вы можете сделать это с помощью программы C или .NET, вызвав [функцию Windows API «IsWindowVisible»] (http://msdn.microsoft.com/en-us/library/ms633530%28v=vs.85%29.aspx), но я чувствую, что этот ответ не то, что вы искали. – Tomalak