1

Тема: VBS, JScript: получить список ДиспетчерЗадач - Приложения

Коллеги,

добрый день.

Уж сколько раз мы тут рассматривали как получить список процессов - то, что видно в ДиспетчереЗадач на второй вкладке Процессы (в английском варианте Processes).

Мне же необходимо получить список из первой вкладки ДиспетчераЗадач - Приложения (в английском варианте Applications).
Нашел вариант с использованием Word:

'
' список открытых приложений
'

Set Word = CreateObject("Word.Application")
Set Tasks = Word.Tasks
For Each Task in Tasks
    If Task.Visible Then Wscript.Echo Task.Name
Next
Word.Quit

Недостатков два - и оба я считаю существенными:
1) Необходимость наличия объекта Word
2) Постоянный опрос вместо реакции по событию появления нового приложения.

Ну еще бы и хотелось знать имя процесса от которого появилось приложение.

Спасибо.

2

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

динамиквраппер не возбраняется ?

Я конечно далек от мысли... (с)

3

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

smaharbA пишет:

динамиквраппер не возбраняется ?

smaharbA,

я считаю, что у любой задачи есть множество решений.
А уж какое в конкретной ситуации подходит наилучшим образом - решать разработчику.

Поэтому никаких ограничений.

4

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

выполнить с помощью Windows Management Instrumentation (WMI) WQL-запрос вида

SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA "Win32_Process"
Slav пишет:

реакции по событию появления нового приложения

решаются с помощью асинхронных запросов.

Оно?

( 2 * b ) || ! ( 2 * b )

5

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

Rumata пишет:

выполнить с помощью Windows Management Instrumentation (WMI) WQL-запрос вида

SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA "Win32_Process"

Оно?

Rumata,

нет - не оно.

Уж сколько раз мы тут рассматривали как получить список процессов - то, что видно в ДиспетчереЗадач на второй вкладке Процессы (в английском варианте Processes).

Мне же необходимо получить список из первой вкладки ДиспетчераЗадач - Приложения (в английском варианте Applications).

6

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

я считаю, что у любой задачи есть множество решений.

Slav, в таком разе пользуйте PowerShell. Там у класса System.Diagnostics.Process непосредственно есть свойство Process.MainWindowTitle.

7

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

Slav
Извините, не обратил внимание, что Вы говорите о приложениях.

( 2 * b ) || ! ( 2 * b )

8

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

alexii пишет:

Slav, в таком разе пользуйте PowerShell. Там у класса System.Diagnostics.Process непосредственно есть свойство Process.MainWindowTitle.

alexii,

видимо все-таки придется осваивать PowerShell - правда придется переехать в другой раздел форума.

Посмотрел Вашу ссылку. Не совсем то, что мне нужно. Или я плохо смотрел?

1) Да, я могу получить MainWindowTitle процесса. Но ведь у каждого процесса в Windows есть главное окно - даже если его никто никогда не видел. Т.е. на каждый процесс мне по любому что-то вернется - но это не будет "список из первой вкладки ДиспетчераЗадач - Приложения (в английском варианте Applications)." А мне нужен именно он.
Если Вы посмотрите мой пример из первого поста, то там эта задача решается использованием Task.Visible - ничего похожего в System.Diagnostics.Process я не нашел.

2) Ну очень хочется узнавать о появлении нового приложения (фактически - нового видимого окна) по событию. Не хочу в цикле опрашивать каждую секунду, две, три... список процессов, узнавать у каждого его окно а потом гадать - оно видимое или нет.

Пока приспособил для своей задачи tasklist - чуть позже выложу отлаженый скрипт.

Да, пожалуй, уточню задачу - может вариантов станет больше.
Есть процесс с известным мне именем - именно процесс. В зависимости от ситуации этот процесс создает видимые окна, которые - естесственно - появляются в списке приложений. Именно приложений. Мне необходимо узнать о появлении очередного окна и получить его название - в этом названии нужная мне информация.
Если интересно - это задача из телефонии. Софтфон висит как процесс, когда поступает звонок создается видимое окно, в названии окна - абонент и его номер.

9

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

Slav пишет:

Word.Application

Визуально сравнил списки приложений: один, полученный с помощью кода из первого сообщения и второй - с помощью Диспетчера Задач. Они различаются.

C:\PROGS\SCRIPTS\JavaScript>ver

Microsoft Windows [Version 6.0.6002]

C:\PROGS\SCRIPTS\JavaScript>cscript z.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.

Windows Task Manager
Start
cscript z.vbs - Far 2.0.1807 x86 Администратор
Серый форум / VBS, JScript: получить список ДиспетчерЗадач - Приложения - Mozilla Firefox
Inbox - Microsoft Outlook

Windows Task Manager
Program Manager

Ваша программа почему-то показал два Диспетчера (курсивом). Он же сам показал только три (выделено жирным) - так оно и есть, хотя сам Диспетчер должен был бы отображаться в собственном окне.

( 2 * b ) || ! ( 2 * b )

10 (изменено: smaharbA, 2012-06-26 10:28:22)

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

( tasklist /fi "Пользователь eq %username%" /fo csv /nh /v 2> nul || tasklist /fi "username eq %username%" /fo csv /nh /v ) | find /v "Н/Д"

Я конечно далек от мысли... (с)

11

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

smaharbA пишет:

( tasklist /fi "Пользователь eq %username%" /fo csv /nh /v 2> nul || tasklist /fi "username eq %username%" /fo csv /nh /v ) | find /v "Н/Д"

smaharbA,

спасибо - лаконично и... почти то, что надо.

К сожалению, в список попадают так же те программы, которые в трее внизу справа.
Логично - главное окно-иконка видна.
Но мне как раз этого не нужно.

12

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

Slav пишет:

1) Да, я могу получить MainWindowTitle процесса. Но ведь у каждого процесса в Windows есть главное окно - даже если его никто никогда не видел. Т.е. на каждый процесс мне по любому что-то вернется - но это не будет "список из первой вкладки ДиспетчераЗадач - Приложения (в английском варианте Applications)." А мне нужен именно он.

Коллега, надеюсь, Вы понимаете, что перед тем, как добавлять процесс в список, нужно ещё проверять, является ли его основное окно видимым или скрытым?

P.S. Иконка — не окно. Иконки в System Tray не имеют никакого отношения к окнам.

13

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

Rumata пишет:

...Ваша программа почему-то показал два Диспетчера (курсивом). Он же сам показал только три (выделено жирным) - так оно и есть, хотя сам Диспетчер должен был бы отображаться в собственном окне.

Rumata,

посмотрел внимательно - согласен, с Диспетчером какие-то непонятки.
Но это - скажем так - проблемы второстепенные, можно самому обработать.

Проблемы первостепенные этого подхода - исключительно на мой взгляд - следующие:
1) Нужен Word
2) Нет реакции на событие.
Ну и для полной гармонии - хотелось бы узнать для окна его процесс.
Но в рамках объекта Task это невозможно.

14

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

alexii пишет:

Коллега, надеюсь, Вы понимаете, что перед тем, как добавлять процесс в список, нужно ещё проверять, является ли его основное окно видимым или скрытым?

P.S. Иконка — не окно. Иконки в System Tray не имеют никакого отношения к окнам.

alexii,

1) Не понял термина "основное окно". У стандартного windows-приложения есть parent-окно и, возможно, chield-окна. Parent-окно совсем не обязательно может быть видимым - программа может работать как некий монитор и при необходимости генерировать chield-окна (сообщения, диалоги и т.д.)
В списке Диспетчера видны как раз не "основные окна" - а видимые.
Которые могут быть и parent и chield.

2) Иконка такое же окно. Есть программы, для которых она даже является parent.

15

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

«основное окно» —:

Главное окно — это окно, создаваемое при запуске процесса. После инициализации могут быть открыты другие окна, включая окна Modal и TopLevel, но первым окном, связанным с процессом, будет оставаться главное окно.

Можно получать свойство MainWindowHandle только для процессов, запущенных на локальном компьютере. Значение свойства MainWindowHandle — это значение, которое однозначно определяет окно, связанное с процессом.

Главное окно связывается с процессом только при наличии графического интерфейса у данного процесса. Если связанный процесс не имеет главного окна, значение свойства MainWindowHandle равно нулю.

Slav пишет:

В списке Диспетчера видны как раз не "основные окна" - а видимые.

Не совсем так: видимые окна верхнего уровня.

Slav пишет:

Иконка такое же окно.

Нет.

Slav пишет:

Есть программы, для которых она даже является parent.

Которых?

16

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

alexii пишет:

...

Slav пишет:

Иконка такое же окно.

Нет.

Slav пишет:

Есть программы, для которых она даже является parent.

Которых?

alexii,

предлагаю Вам запустить команду из поста #10 коллеги smaharbA и убедиться в этом самому.

Я пользуюсь русским драйвером Punto Switcher.
Висит иконкой в трее и замечательно делает свое дело.
Вот строка из списка видимых окон на моем компе:

"punto.exe","8508","Console","0","4 656 КБ","Работает","МойДомен\яПользователь","0:00:00","Punto Switcher Main Window"

В принципе можем продолжить эту тему.
Но я бы попросил у Вас о другом.
К сожалению, PowerShell я не знаю совсем.
Чтобы не открывать кросс-тему в другом разделе не могли бы Вы здесь разместить скрипт на PowerShell по моему вопросу:
в цикле (например, с периодом 3 секунды) анализировать все видимые окна на предмет их названий.

Спасибо.

17

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

Slav, можете продолжать верить в то, что иконки в SystemTray — это окна. Я давно понял, что Ваши убеждения — самые правильные.

18

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

ну положим даже и кнопки на формах и прочие лейблы это тоже окна
конечно не все, что видим в систрее это окна, но окна присутвуют либо незримо, либо без областей

Я конечно далек от мысли... (с)

19

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

smaharbA пишет:

ну положим даже и кнопки на формах и прочие лейблы это тоже окна

Угу.

smaharbA пишет:

конечно не все, что видим в систрее это окна…

Что мы видим в System Tray — совсем не те окна.

smaharbA пишет:

…но окна присутвуют либо незримо, либо без областей

Угу. Либо вовсе отсутствуют.


Я так понимаю: надо найти соответствие между стилями окон и перечнем окон в Диспетчере задач. Хотя можно поступить и иначе: найти блуждающие по Сети исходные коды одной из версий Windows 2000 .

20

Re: VBS, JScript: получить список ДиспетчерЗадач - Приложения

Список окон "как в Диспетчере" получить не удалось, но для моей задачи хватило принципа как в приведенном скрипте.

По каждому процессу получаем "Заголовок окна" а там уж сами решайте - подходит или не подходит.

Всем участникам благодарен за внимание к моему вопросу и оживленную дискуссию.
Надеюсь на дальнейшее плодотворное сотрудничество.

' окно процесса

  Set WshShell = WScript.CreateObject("WScript.Shell")

  if Instr(1, WScript.FullName, "WScript.exe", 1) > 0 Then
     WshShell.Run "CScript """ & WScript.ScriptFullName & """", 0
     Set WshShell = Nothing
     WScript.Quit 1
  End if

  strComputer = "."

  Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" _ 
      & strComputer & "\root\cimv2") 

  Set colProcess = objWMIService.ExecQuery _
      ("Select * from Win32_Process")

  Set Stream   = CreateObject("ADODB.Stream")

  For Each objProcess in colProcess
      Set WshExec = WshShell.Exec("cmd")
      With WshExec.StdIn
           .WriteLine "tasklist /FI ""IMAGENAME eq " + objProcess.Name + """ /V /FO ""LIST"""
           .WriteLine "exit"
      End With
      ss = WshExec.StdOut.ReadAll
      ss = StrConv(ss, "Windows-1251", "cp866")
      MsgBox ss
      Set WshExec = Nothing
  Next

  Set Stream   = Nothing
  Set WshShell = Nothing

  WScript.Quit 0


' конвертация из DOS в WINDOWS
Function StrConv(Text, SourceCharset, DestCharset)
    Stream.Type = 2
    Stream.Mode = 3
    Stream.Open
    Stream.Charset = SourceCharset
    Stream.WriteText Text
    Stream.Position = 0
    Stream.Charset = DestCharset
    StrConv = Stream.ReadText
    Stream.Close
End Function